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

SQL Server 日期邊界計算大全:年/季/月/周 首尾日期一鍵獲取

     編輯:關於SqlServer

核心模式:DATEDIFF + DATEADD 「歸零再偏移」

-- 通用模板
DATEADD(<datepart>, DATEDIFF(<datepart>, 0, GETDATE()), <offset>)

0 代表基準日期 1900-01-01。DATEDIFF 計算跨越了多少個完整邊界,DATEADD 再加回去即得到當前邊界起點。

完整函數庫

目標T-SQL 表達式結果示例 (基準 2013-12-31)
當前日期CONVERT(VARCHAR(10), GETDATE(), 120)2013-12-31
當前日期時間GETDATE()2013-12-31 14:36:46.860
本月第一天 00:00DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)2013-12-01 00:00:00.000
本周一 00:00DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE()), 0)2013-12-30 00:00:00.000
今年第一天 00:00DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()), 0)2013-01-01 00:00:00.000
本季度第一天 00:00DATEADD(QUARTER, DATEDIFF(QUARTER, 0, GETDATE()), 0)2013-10-01 00:00:00.000
上月最後一刻DATEADD(MILLISECOND, -3, DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0))2013-11-30 23:59:59.997
去年最後一刻DATEADD(MILLISECOND, -3, DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()), 0))2012-12-31 23:59:59.997
本月最後一刻DATEADD(MILLISECOND, -3, DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())+1, 0))2013-12-31 23:59:59.997
今年最後一刻DATEADD(MILLISECOND, -3, DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE())+1, 0))2013-12-31 23:59:59.997
本月第一個周一DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(DAY, 6-DATEPART(DAY, GETDATE()), GETDATE())), 0)2013-12-02 00:00:00.000

關鍵技巧解析

  • -3 毫秒:DATETIME 精度 3.33ms,避開午夜邊界落入下一天
  • +1 偏移:取「下一個邊界起點」再減 3ms 即得「當前邊界終點」
  • 周邊界:SQL Server 以 周一為週首(DATEFIRST=1),基準 1900-01-01 為周一

現代替代 (SQL 2012+)

-- EOMONTH 直接取月末
SELECT EOMONTH(GETDATE());           -- 本月最後一天 00:00
SELECT EOMONTH(GETDATE(), -1);       -- 上月最後一天

-- DATETIMEFROMPARTS 精確構造
SELECT DATETIMEFROMPARTS(YEAR(GETDATE()), 1, 1, 0, 0, 0, 0); -- 年初
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved