案例表达式-比较日期



如果最后期限列(e.deadline(<today(getdate(然后返回1,否则返回0。

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

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

例如,如果截止日期=2022年1月10日,而今天=2022年01月11日

  • 我的查询返回1(10/01/2022<11/01/2022(
  • 我只想比较月份和年份-我希望它返回0,因为MM/YYYY是一样的(01/2022=01/2022(

编辑:

专栏他。Deadline的格式如下:DD/MM/YYYY HH/MM,这无法与GETDATE进行比较,为了解决这个问题,我不得不使用CONVERT(VARCHAR(10(,GETDATE((,111(而不是GETDATE

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

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

有什么想法吗?

非常感谢!

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

在比较这两个值之前,将日期设置为当月的最后一天,这样在结束时只有月份/年份才重要

编辑:只要Deadlinedate。。。如果不是,那么在调用上的EOMONTH之前,必须将其转换为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)

最新更新