Sql-Server

在 WHERE 子句中使用日期時間列的 DATE 部分

  • May 13, 2020

我正在建構一個 POS 系統,在其中收集事件發生的日期和時間。我想DATE在我的 SQL 查詢中僅使用 datetime 列的一部分來提取一些報告。

我目前的查詢如下所示:

SELECT * FROM tbl_item_trans
WHERE  (date_time BETWEEN @start AND @end)
ORDER BY date_time DESC, code

但是,如果我輸入兩個日期,例如 9 月 14 日和 15 日,它只會從 14 日提取數據。如果我想包括 9 月 15 日的交易,則結束日期必須是 9 月 16 日。

我怎麼解決這個問題?DATE如果我只使用列的一部分也會更好datetime

和變數使用數據類型@start,例如“2017-09-16”。@end``date

社區維基回答

嘗試包含的開始日期和獨占的結束日期:

date_time >= @start AND date_time < DATEADD(day, 1, @end)

另請參閱BETWEEN 和魔鬼有什麼共同點?亞倫伯特蘭。


如果查詢被編寫為 use ,Sargability 就不會成為問題CAST(date_time AS DATE),因為 SQL Server 將包含一個幫助器覆蓋 seek 謂詞。請參閱Rob Farley(記錄於 2010 年的 SQLBits VII )的了解 SARGability(以使您的查詢執行得更快) ,其中展示了這一點。但是請注意,轉換可能仍會影響基數估計的準確性。

引用自:https://dba.stackexchange.com/questions/186133