使用SQL判断输入日期、即将到期和已到期

使用SQL判断输入日期、即将到期和已到期,sql,sql-server,datetime,case,Sql,Sql Server,Datetime,Case,根据之前的问题,我已经询问了有关此数据的信息 然后,我有一个表,它给了我ConnectionID(以及到Patients表的链接,这样我就可以推断出他们的名字)、评估名称和检查日期 我添加了一个名为updatestatus的额外列,用于显示 如果审查日期至少在未来一周内,则为“生效日期” 如果审核日期在GetDate()之后的7天内,则为“即将到期” 如果审核日期是GetDate()的前一天(即昨天)或更早,则为“过期” 我一直在努力研究这个看似简单而明显的逻辑编程,以至于我感到头痛,需要

根据之前的问题,我已经询问了有关此数据的信息

然后,我有一个表,它给了我ConnectionID(以及到Patients表的链接,这样我就可以推断出他们的名字)、评估名称和检查日期

我添加了一个名为updatestatus的额外列,用于显示

  • 如果审查日期至少在未来一周内,则为“生效日期”
  • 如果审核日期在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应该是第一个,否则它将很快过期。