8

我有一个使用expressTedious的 Web Api在 Azure SQL 数据库上存储一些数据。使用nvarchar类型和int类型它工作得很好,但是当我尝试保存DateTime值时,我收到一条错误消息:

Insert into Proxy (Ip, RequisitionDate) 
values ('1', '2016-05-18 3:32:21' )

错误:

RequestError:参数“RequisitionDate”的验证失败。日期无效。] 消息:“参数 \'RequisitionDate\' 的验证失败。” 无效日期。',代码:'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 上执行查询,它工作正常。

4

3 回答 3

8

看来您没有datetime在函数中设置正确的值addParameter。根据API 参考,该函数用作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);
}

如有任何进一步的疑虑,请随时告诉我。

于 2016-05-19T02:57:09.750 回答
0

很快,您可以使用 SQL Server CONVERT 函数将您的日期字符串转换为与 SQL Server 兼容。下面是一个例子:

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

于 2020-08-24T04:08:47.233 回答
0

很多人都有这个问题。这就是我通常的解决方法。首先,我们需要了解 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');

祝你好运,玩得开心编码。

于 2022-02-18T07:21:17.277 回答