SQL Server 基于天数的返回日期范围

jk9hmnmh  于 2023-01-08  发布在  其他
关注(0)|答案(2)|浏览(105)

我尝试使用以下SQL查询,基于第3列中的NoOfDays,将日期范围作为第4列返回。
例如:
如果将70作为NoOfDays,则应将61-70作为DateRange返回
如果将51作为NoOfDays,则应将51-60作为DateRange返回
如果将100作为NoOfDays,则应将91-100作为DateRange返回
如果将174作为NoOfDays,则应将171-180作为DateRange返回

DECLARE @V_START INT = 1;
DECLARE @V_END INT = 10;

SELECT GETDATE() CurrentDate, TASK_ASSIGNED_DTM,
       DATEDIFF(DAY, TASK_ASSIGNED_DTM, GETDATE()) NoOfDays, (CAST(@V_START AS VARCHAR(10))+'-'+CAST(@V_END AS VARCHAR(10))) AS DateRange                       
FROM Table
pgpifvop

pgpifvop1#

也许这对你有用?
您可以使用 modulo 来确定如何格式化您的范围,如下所示:

with sample as (
  select * from (values(70),(51),(100),(174))x(n)
)
select Iif(n % 10 = 0, Concat(n - 9, '-', n), Concat(n - (n % 10) + 1, '-', n - (n % 10) + 10)) as Range
from sample;

您可以将此应用于当前查询(当然是未经测试的),如下所示:

select GetDate() CurrentDate, TASK_ASSIGNED_DTM,
  n.NoOfDays, 
  Iif(n.NoOfDays % 10 = 0, 
    Concat(n.NoOfDays - 9, '-', n.NoOfDays), 
    Concat( n.NoOfDays - (n.NoOfDays % 10) + 1, '-', n.NoOfDays - (n.NoOfDays % 10) + 10)
  ) as Daterange                  
from table
cross apply(values(datediff(day, TASK_ASSIGNED_DTM, getdate())))n(NoOfDays);
2w2cym1i

2w2cym1i2#

我倾向于使用一个通用的TIER表,它减少了接触点的数量(从代码中删除),并为业务逻辑和后续的演进提供了一个更加数据驱动的方法。
这里有一个大大简化的方法,表变量@Tiers应该是一个物理表。

    • 示例**
Declare @Tiers Table ([Grp] varchar(50),[Dsc] varchar(50),[R1] int,[R2] int)
Insert Into @Tiers Values 
 ('DPD','Current',0,30)
,('DPD','31-50',31,50)
,('DPD','51-60',51,60)
,('DPD','61-70',61,70)
,('DPD','71-80',71,80)
,('DPD','81-90',81,90)
,('DPD','91-100',91,100)
,('DPD','101-170',101,170)
,('DPD','171-180',171,180)
,('DPD','181+',181,9999)
 

Declare @YourTable Table ([TASK_ASSIGNED_DTM] date)
Insert Into @YourTable Values 
 ('2022-07-15')
,('2022-08-29')
,('2022-12-03')
,('2023-01-02')
 

Select A.*
      ,B.Dsc
 From  @YourTable A
 Join  @Tiers     B on B.Grp='DPD' and datediff(DAY,TASK_ASSIGNED_DTM,getdate()) between R1 and R2
    • 结果**
TASK_ASSIGNED_DTM   Dsc
2022-07-15          171-180
2022-08-29          101-170
2022-12-03          31-50
2023-01-02          Current

相关问题