最接近当前日期的SQL case语句

时间:2019-01-09 23:43:52

标签: sql sql-server

需要帮助来创建案例语句,以查找日期表中最接近的日期。我的数据:https://imgur.com/hkBu4SA

我基本上想设置:

Y标志,如果它与a.FROM_EFFDT中的当前日期最接近,并且不为null。 如果to_effdate为null,则为F 其他N

         WHEN a.FROM_EFFDT < GETDATE() AND (to_effdate) IS NOT NULL THEN 'Y' 
         WHEN to_effdate IS NULL THEN 'F' 
         ELSE 'N' 

4 个答案:

答案 0 :(得分:0)

您也许可以用类似的方法完成它。尽管这不是防弹措施,但如果捆绑了最近的日期,您可能会得到重复。

create table Dates (from_effdt datetime, to_effdt datetime, flag varchar(1))

insert Dates (from_effdt, to_effdt, flag)
values
('2019-03-16', null, '') ,
('2018-06-14', '2019-03-16', '') ,
('2018-05-14', '2018-06-14', '') ,
('2018-01-01', '2018-05-14', '') 

select * from Dates

UPDATE Dates
SET flag = 
CASE 
WHEN from_effdt = (
    select top 1 from_effdt
    from Dates
    order by ABS ( DATEDIFF(day, from_effdt, getdate()) )
)
THEN 'Y'
ELSE
    'N'
END

* update,不确定为什么我将其创建为更新。此选择应该可以。

SELECT from_effdt, to_effdt,
CASE 
WHEN from_effdt = (
    select top 1 from_effdt
    from Dates
    order by ABS ( DATEDIFF(day, from_effdt, getdate()) )
)
THEN 'Y'
ELSE
    'N'
END [numberOfDaysAway]
FROM Dates

答案 1 :(得分:0)

您可以使用窗口功能:

(case when row_number() over (order by abs(datediff(day, getdate(), to_effdate)) = 1
      then 'Y'
      when to_effdate is null then 'F'
      else 'N'
 end) 

答案 2 :(得分:0)

您可以简单地执行以下操作:

CASE 
WHEN from_effdt = (
    select from_effdt
      from Dates
      where abs(datediff(second, from_effdt, getdate()))
        = (select min(
        abs(datediff(second, from_effdt, getdate()))
)
from Dates)
)
THEN 'Y'
ELSE
    'N'
END

答案 3 :(得分:0)

ROW_NUMBER() Over (Partition by id order by to_effdt desc)
,id
,from_effdt
,to_effdt
, CASE WHEN (ROW_NUMBER() Over (Partition by id order by to_effdt desc) = 1) THEN ('Y')
       WHEN (to_effdt IS NULL) THEN ('F') ELSE ('N') End as flag
from a