为什么我的' WHERE'基于“DATE”条款的条款失败?

时间:2017-08-31 09:57:39

标签: sql node.js

我使用node.js连接到SQL数据库(具体是SQL Server 2016)。我的表名为transactionCounts,具有以下表和数据类型:

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

' date'为清晰起见,字段只是日期,而不是日期时间。记录如下:" 2017-08-07"

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

所以基本上,我有一个接受开始日期和结束日期的函数,并与它们一起完成:

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) => {});
        });
};

我为了插图而简化了功能(它通常会返回一个承诺),但是这里出了什么问题:

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

26虽然(肯定)不被包括在内,但我并不完全确定,但我确定第19个包括在内。我认为这是一个夏令时问题,因为这些日期,当我致电.toISOString()时,分别看起来像2017-08-19T23:00:00.000Z2017-08-26T23:00:00.000Z(前一天晚上11点)。

我修改了我的函数以使用字符串而不是日期,这似乎有用并返回正确的和:

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) => {});
        });
};

但似乎错误的是把我的日期变成字符串以解决这个问题。在Javascript日期和SQL日期之间处理日期的正确方法是什么,以避免这种明显的Daylight-Savings引起的问题?

1 个答案:

答案 0 :(得分:2)

您的问题是JavaScript没有“日期”类型,只有“datetime”,但SQL确实有“日期”类型。因此,您必须进行转换。

如果将它包装在函数中,它仍然可读:

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) => {});
    });