2

我正在编写一个使用 SQL Server 作为数据存储的 NodeJS 应用程序。Node 使用mssql本机驱动程序连接到 SQL Server 。

当我从数据库中选择具有空时间字段的日期对象时,将返回存储日期之前的日期。例如,如果日期字段是 10/5/2005,则返回 10/4/2005。

以下是要复制的完整详细信息:

首先,创建一个包含日期时间列的表:

/****** Object:  Table [dbo].[testDate]    Script Date: 8/28/2014 8:11:35 AM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[testDate](
    [testID] [int] IDENTITY(1,1) NOT NULL,
    [testDate] [datetime] NULL
) ON [PRIMARY]

GO

然后我可以使用这个 NodeJS 代码来演示这个问题。它在 testDate 表中创建一条新记录,选择新记录,然后使用 console.log 输出日期列。

这是插入查询:

insert into testDate (testDate) values ('10/5/2005')

然后运行一个选择查询:

select *from testDate
where testID = 1

这将返回新行。像这样的东西:

testID: 1   
testDate: 2005-10-05 00:00:00.000

时间戳值的日期为零 - 这是预期的 - 并且 10/5/2005 作为日期 - 这也是有道理的。当使用 Node 内部的 mssql 驱动程序选择此项时,它变为:

Tue Oct 04 2005 20:00:00 GMT-0400 (Eastern Daylight Time)

基本上,给我 2005 年 10 月 4 日而不是 2005 年 10 月 5 日。我已经尝试了多个日期,并且能够始终如一地复制该问题。

我究竟做错了什么?

为了完整起见;

  1. 如果我将时间戳添加到存储的日期值(12:00 或 12:01),则表示正确日期的日期对象会在 NodeJS 中正确返回。
  2. 如果我使用不同的技术选择相同的记录——我尝试了 ColdFusion——返回的日期对象是正确的。

这是一个完整的半可运行 NodeJS 代码片段,它将插入一条新记录,选择它,并将日期列输出到控制台:

// import the db driver
var sql = require("mssql");

// set up the config to access the database
var config = {
    user: 'sa',
    password: 'whatever',
    server: 'myserver.com', 
    database: 'testDB'
};

// Query to insert into database
var query= "insert into testDate (testDate) values ('10/5/2005')";
var query= query + " SELECT SCOPE_IDENTITY() as testID";
console.log(query);

// create connection
var connection = new sql.Connection(config, function(err) {
    // when connection is made trigger off the first query
    var request = new sql.Request(connection);
    request.query(query, function(err, recordset){
        // result handler for query 1
        console.log(err); // undefined if everything is set up right
        console.log(recordset[0].testID); // the ID of the record we just inserted

        // select the item we just created from the database
        var query2= "select * from testDate where testID = " + recordset[0].testID;
        console.log(query2);

        // execute second query
        var connection = new sql.Connection(config, function(err) {
            var request = new sql.Request(connection);
            request.query(query2, function(err, recordset){
                console.log(err); // undefined if everything is set up right
                console.log(recordset[0].testDate); // The Date; which is returning "Tue Oct 04 2005 20:00:00 GMT-0400 (Eastern Daylight Time" instead of Wednesday 10/5/2005
            });
        })

    });
})

目前,我假设我做错了,而不是 mssql 驱动程序中的错误;但如果没有人能指出我做错了什么,我会非常乐意在 mssql github 帐户上打开一个问题。

4

0 回答 0