为什么基于“DATE”的“WHERE”子句失败?

我正在使用node.js连接到SQL数据库(特别是SQL Server 2016)。 我的表,名为transactionCounts,具有以下表和数据types:

staff_id: varchar(50), date: Date, count: int;

为了清楚起见,“date”字段只是一个date,而不是date时间。 logging看起来像这样:“2017-08-07”

我正在使用mssql包, const sql = require('mssql');

所以基本上,我有一个函数接受开始date和结束date,并与他们做这个:

 function(start, end) { let ps = new sql.PreparedStatement(transactionRegisterSqlPool); ps.input('start', sql.Date); ps.input('end', sql.Date); ps.prepare('SELECT staff_id, SUM(Count) TotalCount FROM [TransactionRegister].[dbo].[transactionCounts] ' + 'WHERE date >= @start AND date < @end GROUP BY staff_id', err => { .execute({start: start, end: end}, (err, result) => {}); }); }; 

为了简化说明,我简化了function(通常会返回一个承诺),但是这里出了什么问题:

我通过了8月20日午夜和8月27日午夜的date,我期望得到的是20,21,22,23,24,25和26date的总和(7天,一周)。

虽然(绝对)不包括26号,但我不完全确定,但是我打赌第19号被列入。 我认为这是一个夏令时问题,因为这些date,当我打电话给.toISOString() ,看起来像2017-08-19T23:00:00.000Z2017-08-26T23:00:00.000Z (晚上11点)。

我已经修改我的函数使用string,而不是date,这似乎工作,并返回正确的总和:

 function(start, end) { let ps = new sql.PreparedStatement(transactionRegisterSqlPool); ps.input('start', sql.VarChar); ps.input('end', sql.VarChar); start = `${start.getFullYear()}/${start.getMonth() + 1}/${start.getDate()}`; end = `${end.getFullYear()}/${end.getMonth() + 1}/${end.getDate()}`; ps.prepare('SELECT staff_id, SUM(Count) TotalCount FROM [TransactionRegister].[dbo].[transactionCounts] ' + 'WHERE date >= @start AND date < @end GROUP BY staff_id', err => { ps.execute({start: start, end: end}, (err, result) => {}); }); }; 

但是把我的date变成string来解决这个问题似乎是错误的。 什么是正确的方式来处理JavaScriptdate和SQLdate之间的date,以避免这种明显的日光节约引起的问题?

你的问题是,JavaScript没有“date”types,只有“date时间”,但SQL确实有“date”types。 因此,你将不得不做转换。

如果你把它包装在一个函数中,它仍然是可读的:

 function toDateString(d) { return `${d.getFullYear()}/${d.getMonth() + 1}/${d.getDate()}`; } ps.prepare('SELECT staff_id, SUM(Count) TotalCount FROM [TransactionRegister].[dbo].[transactionCounts] ' + 'WHERE date >= @start AND date < @end GROUP BY staff_id', err => { ps.execute({start: toDateString(start), end: toDateString(end)}, (err, result) => {}); });