如何将 node.js 日期转换为 SQL 服务器兼容日期时间?
How to convert node.js date to SQL Server compatible datetime?
我有一个 Web Api 使用 express 和 Tedious 在 Azure SQL 数据库上存储一些数据.对于 nvarchar
类型和 int
类型,它运行良好,但是当我尝试保存 DateTime
值时,我收到一条错误消息:
Insert into Proxy (Ip, RequisitionDate)
values ('1', '2016-05-18 3:32:21' )
错误:
RequestError: Validation failed for parameter 'RequisitionDate'. Invalid date.]
message: 'Validation failed for parameter \'RequisitionDate\'. Invalid date.', code: 'EPARAM' }
嗯,有趣的是
Insert into Proxy (Ip, RequisitionDate)
values ('1', '2016-05-18 3:32:21')
是我在 node.js api 中执行的查询:
var query = "Insert into Proxy (Ip,RequisitionDate) values ( '"+ ip + "', '"+ date + "' )";
console.log(query); // Insert into Proxy (Ip,RequisitionDate) values ( '1', '2016-05-18 3:32:21' )
request = new Request(query, function(err) {
if (err) {
console.log(err);}
});
request.addParameter('Ip', TYPES.NVarChar,'SQL Server Express 2014');
request.addParameter('RequisitionDate', TYPES.DateTime , 'SQLEXPRESS2014');
connection.execSql(request);
}
如果我直接在 SqlManager Studio 上执行查询,它工作正常。
您似乎没有在 addParameter
函数中设置正确的 datetime
值。根据API reference,函数用作request.addParameter(name, type, value, [options])
。
请尝试以下代码:
var query = "Insert into Proxy (Ip,RequisitionDate) values ( @ip , @date)";
request = new Request(query, function(err) {
if (err) {
console.log(err);}
});
request.addParameter('ip', TYPES.NVarChar,'<ip value>');
request.addParameter('date', TYPES.DateTime , new Date());
// or the set the special date, refer to https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
// request.addParameter('RequisitionDate', TYPES.DateTime , new Date(2016,05,19,3,32,21))
connection.execSql(request);
}
如有任何疑问,请随时告诉我。
很快,您可以使用 SQL 服务器 CONVERT 函数将日期字符串转换为与 SQL 服务器兼容。
下面是一个例子:
Insert into Proxy (Ip, RequisitionDate) values ('1', CONVERT(VARCHAR(10), '2020-8-24'))
更多信息,您可以在这里查看:http://www-db.deis.unibo.it/courses/TW/DOCS/w3schools/sql/func_convert.asp.html
很多人都遇到了这个问题。这就是我通常解决它的方式。
首先,我们需要了解 SQL 会尝试将您从 NodeJS 代码发送的任何日期转换为 UTC。那么,SQL 怎么知道要使你的日期与 UTC 相差多少呢?
答案是:
SHOW VARIABLES LIKE '%time_zone%';
如果您在 sql 查询中编写这些命令,它将显示您的 sql 配置的 system_time_zone 和 time_zone。在某些情况下,如果您只是发送 SQL 日期时间而没有提及来自 NodeJS 的时区,它将使用此 time_zone 将您的日期转换为 UTC。现在,我建议开发人员让 SQL 使用 UTC 来存储日期和时间,并且只在前端将日期转换为用户时区。我个人所做的是,我将日期时间连同时区一起发送到 SQL。
moment.utc().format('YYYY-MM-DD HH:mm:ss Z')
这里的 Z 是时区。此代码给出的日期是
2022-02-18 06:56:23 +00:00
由于我使用了moment.utc(),时区自动设置为+0:00。如果我将此格式发送到 SQL 来存储日期,它将不再尝试将日期转换为 UTC 格式。但如果我这样做
moment.utc().format('YYYY-MM-DD HH:mm:ss');
SQL 将使用系统时区偏移量转换此日期时间,即使它已经在 UTC 中。我建议你不要在你的数据库连接模块中使用 dialectOptions,因为将来它不会被支持。在我看来,这是在 sql 中存储日期和时间的好方法。现在,至于向用户显示存储的日期。您可以使用
轻松地将存储在数据库中的 UTC 日期转换为本地语法
moment(<database UTC datetime>).local().format('YYYY-MM-DD HH:mm:ss');
祝你好运,编码愉快。
我有一个 Web Api 使用 express 和 Tedious 在 Azure SQL 数据库上存储一些数据.对于 nvarchar
类型和 int
类型,它运行良好,但是当我尝试保存 DateTime
值时,我收到一条错误消息:
Insert into Proxy (Ip, RequisitionDate)
values ('1', '2016-05-18 3:32:21' )
错误:
RequestError: Validation failed for parameter 'RequisitionDate'. Invalid date.] message: 'Validation failed for parameter \'RequisitionDate\'. Invalid date.', code: 'EPARAM' }
嗯,有趣的是
Insert into Proxy (Ip, RequisitionDate)
values ('1', '2016-05-18 3:32:21')
是我在 node.js api 中执行的查询:
var query = "Insert into Proxy (Ip,RequisitionDate) values ( '"+ ip + "', '"+ date + "' )";
console.log(query); // Insert into Proxy (Ip,RequisitionDate) values ( '1', '2016-05-18 3:32:21' )
request = new Request(query, function(err) {
if (err) {
console.log(err);}
});
request.addParameter('Ip', TYPES.NVarChar,'SQL Server Express 2014');
request.addParameter('RequisitionDate', TYPES.DateTime , 'SQLEXPRESS2014');
connection.execSql(request);
}
如果我直接在 SqlManager Studio 上执行查询,它工作正常。
您似乎没有在 addParameter
函数中设置正确的 datetime
值。根据API reference,函数用作request.addParameter(name, type, value, [options])
。
请尝试以下代码:
var query = "Insert into Proxy (Ip,RequisitionDate) values ( @ip , @date)";
request = new Request(query, function(err) {
if (err) {
console.log(err);}
});
request.addParameter('ip', TYPES.NVarChar,'<ip value>');
request.addParameter('date', TYPES.DateTime , new Date());
// or the set the special date, refer to https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
// request.addParameter('RequisitionDate', TYPES.DateTime , new Date(2016,05,19,3,32,21))
connection.execSql(request);
}
如有任何疑问,请随时告诉我。
很快,您可以使用 SQL 服务器 CONVERT 函数将日期字符串转换为与 SQL 服务器兼容。 下面是一个例子:
Insert into Proxy (Ip, RequisitionDate) values ('1', CONVERT(VARCHAR(10), '2020-8-24'))
更多信息,您可以在这里查看:http://www-db.deis.unibo.it/courses/TW/DOCS/w3schools/sql/func_convert.asp.html
很多人都遇到了这个问题。这就是我通常解决它的方式。 首先,我们需要了解 SQL 会尝试将您从 NodeJS 代码发送的任何日期转换为 UTC。那么,SQL 怎么知道要使你的日期与 UTC 相差多少呢?
答案是:
SHOW VARIABLES LIKE '%time_zone%';
如果您在 sql 查询中编写这些命令,它将显示您的 sql 配置的 system_time_zone 和 time_zone。在某些情况下,如果您只是发送 SQL 日期时间而没有提及来自 NodeJS 的时区,它将使用此 time_zone 将您的日期转换为 UTC。现在,我建议开发人员让 SQL 使用 UTC 来存储日期和时间,并且只在前端将日期转换为用户时区。我个人所做的是,我将日期时间连同时区一起发送到 SQL。
moment.utc().format('YYYY-MM-DD HH:mm:ss Z')
这里的 Z 是时区。此代码给出的日期是
2022-02-18 06:56:23 +00:00
由于我使用了moment.utc(),时区自动设置为+0:00。如果我将此格式发送到 SQL 来存储日期,它将不再尝试将日期转换为 UTC 格式。但如果我这样做
moment.utc().format('YYYY-MM-DD HH:mm:ss');
SQL 将使用系统时区偏移量转换此日期时间,即使它已经在 UTC 中。我建议你不要在你的数据库连接模块中使用 dialectOptions,因为将来它不会被支持。在我看来,这是在 sql 中存储日期和时间的好方法。现在,至于向用户显示存储的日期。您可以使用
轻松地将存储在数据库中的 UTC 日期转换为本地语法moment(<database UTC datetime>).local().format('YYYY-MM-DD HH:mm:ss');
祝你好运,编码愉快。