【问题标题】:SQL CASE rolling date differenceSQL CASE 滚动日期差异
【发布时间】:2022-01-20 11:55:14
【问题描述】:

如何在案例声明中提取年度滚动日期差异?或者,如果有更好的方法可行。当 NXT 周年日期月份在当前月份之后时,我需要将日期滚动到下一年。我需要查看 2022 年即将到来的下一个周年纪念日。

例如:

以下是我正在使用的代码,它适用于本年度。

Declare @prevbiz as Date set @prevbiz = DateAdd(day,Case (Datepart(Weekday,Cast(GetDate() as Date))) 
                                                When 2 then -3
                                                Else -1
                                                End, Cast(GetDate() as Date));  
    
DECLARE @prev12MONTHS AS DATE set @prev12MONTHS  = DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 12, DAY(@enddate)-1)
    
    SELECT
        ANNUALREVIEWDATE
    ,   'NXT Anniversary Date'  =  CASE WHEN DATEADD(yy, DATEDIFF(yy, ANNUALREVIEWDATE, @prevbiz), ANNUALREVIEWDATE)  <= @prev12MONTHS 
                                THEN DATEADD(yy, DATEDIFF(yy, ANNUALREVIEWDATE, @prevbiz) -1, ANNUALREVIEWDATE)
                                 ELSE DATEADD(yy, DATEDIFF(yy, ANNUALREVIEWDATE, @prevbiz), ANNUALREVIEWDATE)
                                 END
    
FROM [table]

【问题讨论】:

  • 因为您使用了图像?而不仅仅是这个问题 - 多个问题。你有太多的代表和经验,不知道图像不应该用于发布重要信息。真的 - 您在 dateadd 函数中使用“yy”而不是“year”付出了多少努力。

标签: sql sql-server


【解决方案1】:

我相信你只是想决定周年纪念是否已经过去,是否应该提前到明年。

datefromparts(
    year(getdate()) +
        case when datefromparts(2000, month(getdate()), day(getdate()))
               >= datefromparts(2000, month(X), day(X)) 
            then 1 else 0 end,
    month(getdate()),
    day(getdate())
)

您也可以单独比较月份和日期部分。 2000 年只是恰好有闰日的任意年份。

【讨论】:

  • 我将您的代码用于带有 case 语句的附加临时表中,以获得我正在寻找的结果。谢谢!
【解决方案2】:

根据我对您的问题的调查结果,这可能会对您有所帮助。

with dates(annualAnniversary) as (

    select DateAdd(month,6,DateAdd(year,-5,cast(GetDate() as date)))
    union 
    select DateAdd(month,3,DateAdd(year,-4,cast(GetDate() as date)))
    union 
        select DateAdd(month,3,DateAdd(year,-1,cast(GetDate() as date))) 
    union 
        select DateAdd(month,5,DateAdd(year,-2,cast(GetDate() as date)))
    union 
        select DateAdd(month,2,DateAdd(year,-1,cast(GetDate() as date)))
    union 
        select DateAdd(month,8,DateAdd(year,-3,cast(GetDate() as date)))
    union 
        select DateAdd(month,0,DateAdd(year,0,cast(GetDate() as date)))
      

)
select annualAnniversary, 
      DateAdd(year,DATEDIFF(year,annualAnniversary, cast(GetDate() as date)),annualAnniversary) as needsToShow  
from dates

为了排除那些没有达到自己的周年纪念日的行,您可以将其添加到上面的代码中:

where DATEDIFF(year,annualAnniversary, cast(GetDate() as date))>0

原始数据输出:

【讨论】:

  • 检查经过的天数是否小于一年并排除,然后使用 2022 年和上一个周年纪念日作为下一个周年纪念日。
  • @GoldenLion 排除了那些不符合自己年度周年纪念日的行,我补充说。但是对于计算下一个周年纪念日,您建议的方式并不是在 select 中调用多个函数的好方法,当我们有数百万条记录时,它会变成麻烦。
  • @GoldenLion,处理大数据时的效率规则
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-09
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-17
相关资源
最近更新 更多