gpt4 book ai didi

sql - 为什么我的 'WHERE' 子句基于 'DATE' 失败?

转载 作者:太空宇宙 更新时间:2023-11-03 23:24:30 25 4
gpt4 key购买 nike

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

staff_id:varchar(50),日期:日期,计数:int;

为了清楚起见,“日期”字段只是一个日期,而不是日期时间。记录如下所示:“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) => {});
});
};

为了便于说明,我简化了该函数(它通常返回一个 promise ),但这里出了问题:

我传入了 8 月 20 日午夜和 8 月 27 日午夜的日期,我期望返回的是日期 20,21,22,23,24,25 和 26 的总和(自然是 7 天) ,一周)。

26 号虽然(肯定)没有被包括在内,我也不完全确定,但我打赌 19 号被包括在内。我认为这是一个夏令时问题,因为当我调用 .toISOString() 时,这些日期看起来像 2017-08-19T23:00:00.000Z >2017-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 日期之间的日期的正确方法是什么,以避免这种明显的夏令时引起的问题?

最佳答案

你的问题是JavaScript没有“日期”类型,只有“日期时间”,但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) => {});
});

关于sql - 为什么我的 'WHERE' 子句基于 'DATE' 失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45978568/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com