Sql-Server
有沒有辦法在 SQL 中計算上個月/年的昨天/今天?
有沒有辦法在 SQL 中計算上個月(和去年)的今天(和昨天)?
假設今天是 2015 年 5 月 26 日,那麼如何找到?
- **去年的今天,**即 2014 年 5 月 26 日?
- **上個月的今天,**即 2015 年 4 月 26 日?
- **去年的昨天,**即 2014 年 5 月 25 日?
- **上個月的昨天,**即 2015 年 4 月 25 日?
真的不需要任何技巧來處理閏年,但這取決於您期望的結果。通常你只是先減去較大的部分,所以在減去一天之前減去一個月,而不是相反。
這些是否會產生您不期望的結果?如果是這樣,哪些對您來說是“錯誤的”,為什麼?
DECLARE @d TABLE(d DATE); INSERT @d(d) VALUES('20150330'),('20150331'), ('20150430'),('20150531'),('20150526'), ('20160229'), -- Leap day: test "Today of last year" and "Yesterday of last year" -- Month after leap day: test "Today of last month" and "Yesterday of last month" ('20160329'),('20160330'),('20160331'), -- March 1st in possible leap year: test "Yesterday" ('20160301'), -- test regular leap year ('20000301'), -- test century divisible by 400 ('19000301'), -- test century not divisible by 400 (not a leap year) -- March 1st in year AFTER possible leap year: test "Yesterday of last year" ('20170301'), -- test regular leap year ('20010301'), -- test century divisible by 400 ('19010301'); -- test century not divisible by 400 (not a leap year) SELECT [Today] = d, [Today of last year] = DATEADD(YEAR, -1, d), [Today of last month] = DATEADD(MONTH, -1, d), [Yesterday] = DATEADD(DAY, -1, d), [Yesterday of last year] = DATEADD(DAY, -1, DATEADD(YEAR, -1, d)), [Yesterday of last month] = DATEADD(DAY, -1, DATEADD(MONTH, -1, d)) FROM @d;
如果您想以不同方式處理閏年、節假日、週末等,也可以考慮使用日曆表。您真正需要做的是充分理解並解釋您的要求。許多月份有 31 天,尤其是閏年,“今天或昨天上個月或上年”的每種可能組合都可以有多種解釋。