在 WHERE 子句中使用日期时间列的 DATE 部分

Man*_*265 1 sql-server date where

我正在构建一个 POS 系统,在那里我收集事件发生的日期和时间。我想通过DATE在我的 SQL 查询中仅使用datetime 列的一部分来提取一些报告。

我当前的查询如下所示:

SELECT * FROM tbl_item_trans
WHERE  (date_time BETWEEN @start AND @end)
ORDER BY date_time DESC, code
Run Code Online (Sandbox Code Playgroud)

但是,如果我输入两个日期,例如 9 月 14 日和 15 日,它只会从 14 中提取数据。如果我想包括 9 月 15 日的交易,结束日期必须是 9 月 16 日。

我怎么解决这个问题?如果我只使用专栏的DATE一部分,那就更好了datetime

@start@end变量使用date的数据类型,例如“2017年9月16日”。

小智 6

社区维基答案

尝试包含开始日期和专有结束日期:

date_time >= @start AND date_time < DATEADD(day, 1, @end)
Run Code Online (Sandbox Code Playgroud)

另请参阅“之间”和“魔鬼”有什么共同点?通过亚伦伯特兰。


如果将查询编写为 use CAST(date_time AS DATE),则 Sargability 不会成为问题,因为 SQL Server 将包含一个覆盖搜索谓词的帮助程序。请参阅Rob Farley(在 2010 年在 SQLBits VII 上录制)演示的理解 SARGability(使您的查询运行得更快)。但请注意,转换可能仍会影响基数估计的准确性。