首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 日期計算模式庫:DATEDIFF/DATEADD 構建月首、周一、年首、季首、今日零點

     編輯:關於SqlServer

日期計算的本質是「從基準點 (1900-01-01) 計算間隔數,再加回基準點」。掌握此模式,任意時間粒度的「首/末」皆可推導。

核心模式:間隔數 + 基準點

DATEADD(interval, DATEDIFF(interval, 0, GETDATE()), 0)
  • 0 隱式轉為 1900-01-01 00:00:00.000
  • DATEDIFF 計算當前到基準點的間隔數
  • DATEADD 將間隔數加回基準點,得到當前粒度的「零點」

高頻計算速查表

目標Interval代碼
本月第一天month (mm)DATEADD(mm, DATEDIFF(mm, 0, GETDATE()), 0)
本周一week (wk)DATEADD(wk, DATEDIFF(wk, 0, GETDATE()), 0)
今年第一天year (yy)DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0)
本季第一天quarter (qq)DATEADD(qq, DATEDIFF(qq, 0, GETDATE()), 0)
今日零點day (dd)DATEADD(dd, DATEDIFF(dd, 0, GETDATE()), 0)

進階變體:末尾時間點

-- 本月最後一天 23:59:59.997
DATEADD(ms, -3, DATEADD(mm, DATEDIFF(mm, 0, GETDATE()) + 1, 0))
-- 本周日 23:59:59.997
DATEADD(ms, -3, DATEADD(wk, DATEDIFF(wk, 0, GETDATE()) + 1, 0))

關鍵前提:DATEFIRST 設置

  • SET DATEFIRST 7 (美式:周日=1) — 默認
  • SET DATEFIRST 1 (歐式:周一=1) — 影響 week/wk 計算
  • 檢查:SELECT @@DATEFIRST
  • 跨環境代碼建議顯式 SET DATEFIRST 或用 DATEPART(dw, ...) 配合邏輯判斷

實戰組合:動態 WHERE 範圍

WHERE CreatedAt >= DATEADD(mm, DATEDIFF(mm, 0, GETDATE()), 0)
  AND CreatedAt < DATEADD(mm, DATEDIFF(mm, 0, GETDATE()) + 1, 0)
-- 精確捕獲「本月」數據,利用索引 SARGable

此模式無循環、無變量、單語句、SARGable,是 SQL 日期計算的「瑞士軍刀」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved