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

日期相關兩大經典 SQL 技巧:取得月份天數與資料列日期補齊

     編輯:關於SqlServer

技巧一:單一陳述式取得指定日期所在月份的總天數

SELECT DAY(DATEADD(dd, -DAY('2004-02-13'), DATEADD(mm, 1, '2004-02-13'))) AS 'Day Number';
-- 結果:29 (2004 年為閏年)

邏輯:
1. DATEADD(mm, 1, 日期) → 下個月同一天。
2. DAY(日期) → 取得日部分 (13)。
3. DATEADD(dd, -13, 下個月同一天) → 本月最後一天。
4. DAY(本月最後一天) → 總天數。

技巧二:稀疏日期資料補齊成連續日期並計算累計餘額

原始資料

日期                收入  支出
2004-02-11          60    45
2004-03-01          60    45
2004-03-02          40    50
2004-03-05          50    40

目標結果:每一天一列,無資料日顯示 NULL,餘額向前帶入

日期                收入  支出  餘額
2004-02-01          NULL  NULL  NULL
...
2004-02-11          60    45    15
2004-02-12          NULL  NULL  15
...
2004-02-29          NULL  NULL  15
2004-03-01          60    45    30
...

核心解法:遞迴 CTE (SQL Server 2005+) 或數字表/暫存表 (SQL 2000 相容)

SQL Server 2000 相容做法:建立一個足夠大的整數序列表 (或利用 master..spt_values),產生日期序列,再 LEFT JOIN 原始資料,最後用子查詢或游標計算累計餘額。

簡化版累計餘額邏輯 (需依序處理)

-- 建立日期序列暫存表 #dates (date datetime)
-- LEFT JOIN 原始表 #src
-- 使用更新游標或相關子查詢計算 running balance
UPDATE #result SET balance = (
    SELECT ISNULL(SUM(收入 - 支出), 0)
    FROM #result r2
    WHERE r2.日期 <= #result.日期
);

總結

「取得月份天數」單一陳述式極具實用價值;「日期補齊與累計」是財務/報表常見需求,現代版本建議使用 LAG/SUM() OVER() 窗格函數,舊版本則善用數字表 + 相關子查詢實現。

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