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
日期 收入 支出 餘額
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
...
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() 窗格函數,舊版本則善用數字表 + 相關子查詢實現。