Sql-Server
日期時間轉換首選方法
使用介於或小於之間的速度和減少數據庫壓力的首選方法是什麼?
SELECT LogId FROM [Master].[dbo].log mlog WHERE cast(LogDate as Date) BETWEEN '2019-01-01' AND '2019-12-31'
或者,這樣做會更好嗎?
SET @StartLogId = (SELECT TOP 1 LogID FROM [Master].[dbo].log mlog WHERE LogDate >= '2019-01-01T00:00:00.000') SET @EndLogId = (SELECT TOP 1 LogID FROM [Master].[dbo].log mlog WHERE LogDate < '2019-12-31T00:00:00.000' ORDER BY LogDate DESC); SELECT LogId FROM [Master].[dbo].log mlog WHERE mlog.LogId >= @StartLogId AND mlog.LogId <= @EndLogId;
我個人的偏好是永遠不要使用
BETWEEN
,因為它不是很清楚,從程式碼本身,範圍是否包括2019-01-01
and2019-12-31
。我意識到可以輕鬆查看手冊以了解BETWEEN
操作方式,但在我看來,這更容易閱讀,沒有任何混淆的機會:SELECT LogId FROM [Master].[dbo].log mlog WHERE cast(LogDate as Date) >= '2019-01-01' AND cast(LogDate as Date) <= '2019-12-31'
但請注意,這
cast(LogDate as date)
不是執行此查詢的最佳方式。更好的解決方案是:SELECT LogId FROM [Master].[dbo].log mlog WHERE LogDate >= '2019-01-01T00:00:00.000' AND LogDate < '2020-01-01T00:00:00.000'
上述語句是 SARGable,也將確保您獲得所需的範圍。比較
<= '2019-12-31'
實際上是指2019 年 12 月 31 日之前,而您實際上可能是指直到 2019 年 12 月 31 日結束。查找小於**第二天開始的日期可確保您獲得開始之間的所有行2019 年 1 月 1 日的一天和 2019 年 12 月 31 日的一天結束。請注意,我
T
在日期和時間組件之間包含一個;這指示 SQL Server 將該值視為ISO8601 日期,這將防止在非美國英語語言安裝下可能引入的錯誤。