Sql-Server

日期時間轉換首選方法

  • October 28, 2020

使用介於或小於之間的速度和減少數據庫壓力的首選方法是什麼?

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-01and 2019-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 日期,這將防止在非美國英語語言安裝下可能引入的錯誤。

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