Sql-Server

有沒有辦法在 SQL 中計算上個月/年的昨天/今天?

  • December 10, 2015

有沒有辦法在 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 天,尤其是閏年,“今天或昨天上個月或上年”的每種可能組合都可以有多種解釋。

引用自:https://dba.stackexchange.com/questions/102492