我希望能够根据日期设置特定代码。
当今天的日期在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
答案 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