我正在编写一个使用 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 日。我已经尝试了多个日期,并且能够始终如一地复制该问题。
我究竟做错了什么?
为了完整起见;
- 如果我将时间戳添加到存储的日期值(12:00 或 12:01),则表示正确日期的日期对象会在 NodeJS 中正确返回。
- 如果我使用不同的技术选择相同的记录——我尝试了 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 帐户上打开一个问题。