2月29日与去年2月28日相比

J.B*_*.B. 5 sql t-sql

我有一个存储过程来提取数据并加入去年的日期数据.问题是当前年度数据无法加入,因为2011年2月29日没有.有其他人遇到过这个问题吗?任何人对如何解决它有任何想法?

这是存储过程:

SELECT 
--b.Date_Rep AS Date_Rep,
SUM(b.AccountsCreatedThisYear) AS AccountsCreatedThisYearTot,
SUM(a.AccountsCreatedThisYear) AS AccountsCreatedLastYearTot,   

FROM Report2011.dbo.T_Report_01 b  WITH (NOLOCK) --This year    
LEFT JOIN Report2011.dbo.T_Report_01 a WITH (NOLOCK) ON DATEADD(yyyy,-1,b.Date_Rep) = a.date_rep --Last year
WHERE (a.Date_Rep BETWEEN DATEADD(year, -1,@StartDate) AND DATEADD(year, -1,@EndDate))
Run Code Online (Sandbox Code Playgroud)

Adr*_*ode 0

    declare @29Feb datetime = convert(datetime,'2012/02/29')
    declare @28Feb datetime = convert(datetime,'2012/02/28')

 select case when 
             dateadd(yy,-1,@29Feb) = dateadd(yy,-1,@28Feb)
             then 1 
             else 0 end
Run Code Online (Sandbox Code Playgroud)

该 select 语句输出 1,因此实际上 2 月 29 日和 2 月 28 日日期在过去的一年中只有一个对应的日期,即 2 月 28 日。

现在,您正在对不同年份的两个期间进行求和,而第一个期间恰好比当前期间少 1 天。
有人会如何回答以下问题:

 "How many accounts have been created in the last year's February and how many this year?" 
Run Code Online (Sandbox Code Playgroud)

一个二月有 28 天,另一个二月有 29 天,这重要吗?我不相信,参考的是二月,而不是日子。

所以我看到这个查询有两个问题:

  • 今年可能有一天没有创建任何帐户,但去年同期有一些帐户创建了,因此左连接不会捕获去年的帐户
  • 对于今年的两个不同日期,28 和 29 只对应一天,28 因此这一天被求和两次。


 SELECT     (SUM(b.AccountsCreatedThisYear)
    FROM Report2011.dbo.T_Report_01 WITH (NOLOCK) --This year
    WHERE Date_Rep BETWEEN @StartDate and @EndDate ) as AccountsCreatedThisYearTot,

    (SUM(b.AccountsCreatedThisYear)
    FROM Report2011.dbo.T_Report_01 WITH (NOLOCK) -- Last Year
    WHERE Date_Rep BETWEEN DATEADD(year, -1,@StartDate) AND DATEADD(year, -1,@EndDate)) as AccountsCreatedLastYearTot
Run Code Online (Sandbox Code Playgroud)