-- 通用模板
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:00 | DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) | 2013-12-01 00:00:00.000 |
| 本周一 00:00 | DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE()), 0) | 2013-12-30 00:00:00.000 |
| 今年第一天 00:00 | DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()), 0) | 2013-01-01 00:00:00.000 |
| 本季度第一天 00:00 | DATEADD(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 |
DATETIME 精度 3.33ms,避開午夜邊界落入下一天-- EOMONTH 直接取月末
SELECT EOMONTH(GETDATE()); -- 本月最後一天 00:00
SELECT EOMONTH(GETDATE(), -1); -- 上月最後一天
-- DATETIMEFROMPARTS 精確構造
SELECT DATETIMEFROMPARTS(YEAR(GETDATE()), 1, 1, 0, 0, 0, 0); -- 年初