首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL Server 日期運算實用腳本:本月首尾日、本周一、本季首日、年度首尾日

     編輯:MySQL 資料庫相關知識

SQL Server 透過 DATEADD + DATEDIFF 組合,可精確計算各類「邊界日期」,不需拆解年月日再組合。以下提供可直接套用的標準腳本。

核心原理

以基準日 0 (1900-01-01) 為起點,計算目標日期與基準日的間隔數,再加回基準日即得邊界值。

常用邊界日期腳本

需求T-SQL 腳本結果範例 (假設今日 2023-10-15)
本月第一天 00:00:00DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)2023-10-01 00:00:00
本月最後一天 23:59:59.997DATEADD(MS, -3, DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())+1, 0))2023-10-31 23:59:59.997
上個月最後一天DATEADD(MS, -3, DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0))2023-09-30 23:59:59.997
本月第一個週一DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(DAY, 6-DATEPART(DAY, GETDATE()), GETDATE())), 0)2023-10-02
本年第一天DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()), 0)2023-01-01 00:00:00
本年最後一天DATEADD(MS, -3, DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE())+1, 0))2023-12-31 23:59:59.997
去年最後一天DATEADD(MS, -3, DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()), 0))2022-12-31 23:59:59.997
本季第一天DATEADD(QUARTER, DATEDIFF(QUARTER, 0, GETDATE()), 0)2023-10-01
本周週一DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE()), 0)2023-10-09

查詢區間範本

-- 本月資料
WHERE DATEPART(MONTH, theDate) = DATEPART(MONTH, GETDATE())
  AND DATEPART(YEAR, theDate)   = DATEPART(YEAR, GETDATE())

-- 本周資料
WHERE DATEPART(WEEK, theDate) = DATEPART(WEEK, GETDATE())
  AND DATEPART(YEAR, theDate) = DATEPART(YEAR, GETDATE())

-- 本季資料
WHERE DATEPART(QUARTER, theDate) = DATEPART(QUARTER, GETDATE())
  AND DATEPART(YEAR, theDate)    = DATEPART(YEAR, GETDATE())

實用函數封裝

CREATE FUNCTION dbo.fn_MonthStart (@dt DATETIME) RETURNS DATETIME AS BEGIN
    RETURN DATEADD(MONTH, DATEDIFF(MONTH, 0, @dt), 0);
END;

CREATE FUNCTION dbo.fn_MonthEnd (@dt DATETIME) RETURNS DATETIME AS BEGIN
    RETURN DATEADD(MS, -3, DATEADD(MONTH, DATEDIFF(MONTH, 0, @dt)+1, 0));
END;

-- 使用
SELECT * FROM Orders
WHERE OrderDate BETWEEN dbo.fn_MonthStart(GETDATE()) AND dbo.fn_MonthEnd(GETDATE());

取得當月總天數 / 當前星期幾

-- 當月天數
SELECT DATEDIFF(DAY, GETDATE(), DATEADD(MONTH, 1, GETDATE()));

-- 星期名稱
SELECT DATENAME(WEEKDAY, GETDATE()); -- 如 'Sunday'
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved