【问题标题】:How to convert node.js date to SQL Server compatible datetime?如何将 node.js 日期转换为 SQL Server 兼容的日期时间?
【发布时间】:2022-02-18 15:21:17
【问题描述】:

我有一个使用 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 上执行查询,就可以了。

【问题讨论】:

    标签: sql-server node.js azure tedious


    【解决方案1】:

    您似乎没有在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);
    }
    

    如有任何疑问,请随时告诉我。

    【讨论】:

      【解决方案2】:

      很快,您可以使用 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

      【讨论】:

        【解决方案3】:

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

        祝你好运,编码愉快。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-05
          • 1970-01-01
          • 2012-08-14
          • 1970-01-01
          • 2019-03-07
          • 2019-10-03
          相关资源
          最近更新 更多