使用SQL判断输入日期、即将到期和已到期
根据之前的问题,我已经询问了有关此数据的信息 然后,我有一个表,它给了我ConnectionID(以及到Patients表的链接,这样我就可以推断出他们的名字)、评估名称和检查日期 我添加了一个名为updatestatus的额外列,用于显示使用SQL判断输入日期、即将到期和已到期,sql,sql-server,datetime,case,Sql,Sql Server,Datetime,Case,根据之前的问题,我已经询问了有关此数据的信息 然后,我有一个表,它给了我ConnectionID(以及到Patients表的链接,这样我就可以推断出他们的名字)、评估名称和检查日期 我添加了一个名为updatestatus的额外列,用于显示 如果审查日期至少在未来一周内,则为“生效日期” 如果审核日期在GetDate()之后的7天内,则为“即将到期” 如果审核日期是GetDate()的前一天(即昨天)或更早,则为“过期” 我一直在努力研究这个看似简单而明显的逻辑编程,以至于我感到头痛,需要
- 如果审查日期至少在未来一周内,则为“生效日期”
- 如果审核日期在GetDate()之后的7天内,则为“即将到期”
- 如果审核日期是GetDate()的前一天(即昨天)或更早,则为“过期”
SELECT <<<<<OTHER FIELDS>>>>>>,
CASE
WHEN (GetDate() < cast(ats.ReviewDate as date)
AND DATEDIFF(DAY,GetDate(), CAST(ats.ReviewDate AS DATE)) <1)
THEN ''IN Date''
WHEN GetDate() > cast(ats.ReviewDate as date) then ''OUT of Date''
WHEN DATEDIFF(day, cast(ats.ReviewDate as date),GetDate()+7 ) > 1 THEN ''DUE SOON''
WHEN ats.ReviewDate is NULL THEN ''Not Yet Reviewed'' END as [Update Status]
END
选择>,
案例
何时(GetDate()<转换(ats.ReviewDate为日期)
和DATEDIFF(DAY,GetDate(),CAST(ats.ReviewDate AS DATE))CAST(ats.ReviewDate AS DATE),然后“过期”
当DATEDIFF(day,cast(ats.ReviewDate为date)大于1时,则“即将到期”
当ats.ReviewDate为空时,“尚未审核”结束为[更新状态]
结束
这显然是不正确的,因为未来的项目(即2020-09-21)为空,即将到期的项目(即2020-08-30)正确地表示“即将到期”,而过去的项目正确地表示“过期”
我遗漏了一些明显的内容,但看不到。请帮助。这是否符合您的要求
case
when ats.ReviewDate is null then 'Not yet reviewed'
when ats.ReviewDate >= dateadd(week, 1, cast(getdate() as date)) then 'In date'
when ats.ReviewDate >= cast(getdate() as date) then 'Due Soon'
else 'Expired'
end
逻辑如下:
- “尚未审核”:审核日期为
null
- “生效日期”:审核日期至少为今天00:00后7天
- “即将到期”:审核日期大于今天(且不超过7天后)
- “过期”:所有其他情况
提示:
case
按顺序计算分支,并在第一次匹配时停止(忽略剩余的分支);将分支置于最佳顺序通常可以简化逻辑并避免在分支之间重复条件。这是否符合您的要求
case
when ats.ReviewDate is null then 'Not yet reviewed'
when ats.ReviewDate >= dateadd(week, 1, cast(getdate() as date)) then 'In date'
when ats.ReviewDate >= cast(getdate() as date) then 'Due Soon'
else 'Expired'
end
逻辑如下:
- “尚未审核”:审核日期为
null
- “生效日期”:审核日期至少为今天00:00后7天
- “即将到期”:审核日期大于今天(且不超过7天后)
- “过期”:所有其他情况
case
按顺序计算分支,并在第一次匹配时停止(忽略剩余的分支);将分支置于最佳顺序通常可以简化逻辑,并避免在分支之间重复条件。last datediff()是错误的,它永远不会是真的,请尝试更改参数的位置,GetDate()+7应该是第一个,否则它将很快过期。您的上一个datediff()是错误的,它永远不会是真的,请尝试更改参数的位置,GetDate()+7应该是第一个,否则它将很快过期。