Skip to content

Commit 2e714ff

Browse files
committed
To prevent errors caused by country-specific date formats during data recovery, the date format is set to yyyy-MM-dd hh:mm:ss when backing up data.
1 parent 2bec04b commit 2e714ff

File tree

2 files changed

+131
-2
lines changed

2 files changed

+131
-2
lines changed

queries/backup-data-test.xml

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
<queries>
2+
<excel db="sourceDB" output="d:/temp/backup_data/${DATE:yyyyMMdd}.csv">
3+
</excel>
4+
5+
<sheet name="activity_logs" use="true">
6+
<![CDATA[
7+
SELECT * FROM sql2db.activity_logs
8+
]]>
9+
</sheet>
10+
11+
<sheet name="companies" use="true">
12+
<![CDATA[
13+
SELECT * FROM sql2db.companies
14+
]]>
15+
</sheet>
16+
17+
<sheet name="employees" use="true">
18+
<![CDATA[
19+
SELECT * FROM sql2db.employees
20+
]]>
21+
</sheet>
22+
23+
<sheet name="product_reviews" use="true">
24+
<![CDATA[
25+
SELECT * FROM sql2db.product_reviews
26+
]]>
27+
</sheet>
28+
29+
<sheet name="entity_relationships" use="true">
30+
<![CDATA[
31+
SELECT * FROM sql2db.entity_relationships
32+
]]>
33+
</sheet>
34+
35+
<sheet name="approval_requests" use="true">
36+
<![CDATA[
37+
SELECT * FROM sql2db.approval_requests
38+
]]>
39+
</sheet>
40+
41+
<sheet name="audit_logs" use="true">
42+
<![CDATA[
43+
SELECT * FROM sql2db.audit_logs
44+
]]>
45+
</sheet>
46+
47+
<sheet name="status_codes" use="true">
48+
<![CDATA[
49+
SELECT * FROM sql2db.status_codes
50+
]]>
51+
</sheet>
52+
53+
<sheet name="approval_relations" use="true">
54+
<![CDATA[
55+
SELECT * FROM sql2db.approval_relations
56+
]]>
57+
</sheet>
58+
59+
<sheet name="migration_log" use="true">
60+
<![CDATA[
61+
SELECT * FROM sql2db.migration_log
62+
]]>
63+
</sheet>
64+
65+
<sheet name="validation_errors" use="true">
66+
<![CDATA[
67+
SELECT * FROM sql2db.validation_errors
68+
]]>
69+
</sheet>
70+
71+
<sheet name="users" use="true">
72+
<![CDATA[
73+
SELECT * FROM sql2db.users
74+
]]>
75+
</sheet>
76+
77+
<sheet name="departments" use="true">
78+
<![CDATA[
79+
SELECT * FROM sql2db.departments
80+
]]>
81+
</sheet>
82+
83+
<sheet name="categories" use="true">
84+
<![CDATA[
85+
SELECT * FROM sql2db.categories
86+
]]>
87+
</sheet>
88+
89+
<sheet name="products" use="true">
90+
<![CDATA[
91+
SELECT * FROM sql2db.products
92+
]]>
93+
</sheet>
94+
95+
<sheet name="audit_table" use="true">
96+
<![CDATA[
97+
SELECT * FROM sql2db.audit_table
98+
]]>
99+
</sheet>
100+
101+
<sheet name="orders" use="true">
102+
<![CDATA[
103+
SELECT * FROM sql2db.orders
104+
]]>
105+
</sheet>
106+
107+
<sheet name="order_items" use="true">
108+
<![CDATA[
109+
SELECT * FROM sql2db.order_items
110+
]]>
111+
</sheet>
112+
113+
<sheet name="customers" use="true">
114+
<![CDATA[
115+
SELECT * FROM sql2db.customers
116+
]]>
117+
</sheet>
118+
119+
</queries>

src/excel-generator.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,19 @@ class ExcelGenerator {
8686
if (/^[0-9]/.test(id)) id = 'T_' + id;
8787
return id || 'T_SHEET';
8888
}
89+
function formatDateTimeLocal(date) {
90+
// 'yyyy-MM-dd HH:mm:ss' (local time)
91+
const YYYY = String(date.getFullYear());
92+
const MM = String(date.getMonth() + 1).padStart(2, '0');
93+
const DD = String(date.getDate()).padStart(2, '0');
94+
const HH = String(date.getHours()).padStart(2, '0');
95+
const mm = String(date.getMinutes()).padStart(2, '0');
96+
const ss = String(date.getSeconds()).padStart(2, '0');
97+
return `${YYYY}-${MM}-${DD} ${HH}:${mm}:${ss}`;
98+
}
8999
function escapeCsv(val) {
90100
if (val === null || val === undefined) return '';
91-
const s = String(val);
101+
const s = val instanceof Date ? formatDateTimeLocal(val) : String(val);
92102
if (s.includes('"') || s.includes('\n') || s.includes('\r') || s.includes(delimiter)) {
93103
return '"' + s.replace(/"/g, '""') + '"';
94104
}
@@ -98,7 +108,7 @@ class ExcelGenerator {
98108
if (val === null || val === undefined) return 'NULL';
99109
if (typeof val === 'number') return String(val);
100110
if (typeof val === 'boolean') return val ? '1' : '0';
101-
if (val instanceof Date) return `'${val.toISOString().slice(0, 19).replace('T', ' ')}'`;
111+
if (val instanceof Date) return `'${formatDateTimeLocal(val)}'`;
102112
const s = String(val).replace(/'/g, "''");
103113
return `'${s}'`;
104114
}

0 commit comments

Comments
 (0)