SQL Server:在结束日期前30天的CASE日期

时间:2016-09-13 18:52:36

标签: sql-server date case

我希望能够根据日期设置特定代码。

当今天的日期在startdate和enddate之间时,一个是“活跃的”。另一个应在结束前30天申请。

我尝试了类似这样的事情,无法让30天前的演员表现出色。 任何帮助赞赏。

示例:

DECLARE @now datetime = GETDATE()

UPDATE table
SET CODE = CASE 
              WHEN @now BETWEEN i.StartDATE AND i.EndDATE 
                 THEN 'Active'
              WHEN i.EndDATE <= DATEADD(day, -30, GETDATE()) 
                 THEN 'Expiring' 
              ELSE 'Cancelled'
           END

2 个答案:

答案 0 :(得分:1)

如果您在按照自己的方式设置条件时遇到问题,请尝试简化它们并检查SELECT语句中的值。然后应该清楚你需要如何设置你的比较。

DECLARE @now datetime = GETDATE()

UPDATE table
  SET CODE = CASE 
                when @now < i.startdate then 'future'  -- or null
                WHEN @now > i.EndDATE then 'Cancelled'
                when @now >= DATEADD(day, -30, i.EndDATE) THEN 'Expiring' 
                else 'Active'
             END
where code is null or code <> 'Cancelled'

这假设当一行同时处于活动状态且即将到期时,您希望到期代码获胜。即使开始日期是结束日期的前一天,它也处于活动状态且即将到期,您希望设置过期。

答案 1 :(得分:0)

您需要先检查30天,因为这也包含活动状态但会取代它。另外,为了使逻辑更易于阅读,我使用了DATEDIFF

DECLARE @now datetime = GETDATE()

UPDATE table
SET CODE = CASE 
  -- its between the start/end dates AND falls within 30 days of the end date
  WHEN @now BETWEEN i.StartDATE AND i.EndDATE AND DATEDIFF(day, @now, i.EndDATE) < 30
     THEN 'Expiring'
  -- else it falls between the start/end date
  WHEN @now BETWEEN i.StartDATE AND i.EndDATE 
     THEN 'Active'
  -- it falls outside the start/end dates
  ELSE 'Cancelled'
END