案例表达式 - 比较日期

Case expression - comparing dates

我正在使用下面的查询,如果截止日期列 (eh.Deadline) < 今天 (getdate) 那么 returns 1,否则 0。

(case when he.Deadline < CONVERT(VARCHAR(10),GETDATE(),111) then 1 else 0 end) Deadline

一切正常,但我需要更改它以便只比较月份和年份(而不是日期)。

例如,如果截止日期=10/01/2022 并且今天=11/01/2022

编辑:

列 he.Deadline 具有以下格式:DD/MM/YYYY HH/MM 这无法与 GETDATE 进行比较并解决我必须使用 CONVERT(VARCHAR(10 ),GETDATE(),111) 而不是 GETDATE

以上查询用于我创建的仪表板,我不想更改数据库中的任何内容。

我只想比较 MM/YYYY 而不是 DD/MM/YYYY

有什么想法吗?

非常感谢!

首先你需要确保你比较的是 datetime/date 和 datetime/date 不是带日期时间的字符串,也不是带字符串的字符串,因为比较是不同的,而且你的期望的结果是比较日期。

那么您应该将数据存储在正确的数据类型中,对于日期时间来说是 datetime2。将您的 Deadline 存储为字符串会给您带来项目生命周期中的痛苦和麻烦,并且性能会很差。

但是在这种情况下,您需要首先将 Deadline 列正确转换为日期值,然后解决实际问题的一种方法是与当前的第一个进行比较月份如下:

select
    -- Convert to a date datatype in order to be able to correctly compare to another date
    convert(date,substring(he.Deadline,1,10),103) -- Ensure dd/mm/yyyy as opposed to mm/dd/yyyy
    <
    -- Calculate the first of the month and check whether the Deadline is before then
    convert(date,dateadd(day, -1*(datepart(day,getdate())-1), getdate())) then 1 else 0 end Deadline
from (
  values ('10/01/2022 12/30')
) he (Deadline)

你可以(case when EOMONTH(he.Deadline) < EOMONTH(GETDATE()) then 1 else 0 end) Deadline

在比较它们之前将两个值的日期设置为该月的最后一天,因此最后只有 month/year 重要

编辑:只要 Deadlinedate... 如果不是,则必须在调用 EOMONTH 之前将其转换为 date