首页 > 解决方案 > Where 语句中的 UTC 到本地转换

问题描述

我有一个大表,其中有一个以 UTC 存储的日期时间列。我看过很多很多帖子询问如何从 UTC 转换为本地,但是它们都表明它是在 select 语句中完成的,而不是在 where 中完成的。

我已在 select 语句中成功使用了它:

CASE WHEN (Number = 0 or Number is NULL) THEN GETDATE()
     WHEN Number = 1 THEN  DATEADD(mi,30,DATEADD(mi, DATEDIFF(mi, GETUTCDATE(), GETDATE()),UTC_COLUMN))
     WHEN Number = 2 THEN  DATEADD(mi,240,DATEADD(mi, DATEDIFF(mi, GETUTCDATE(), GETDATE()),UTC_COLUMN))
     WHEN Number = 3 THEN  DATEADD(mi,1170,DATEADD(mi, DATEDIFF(mi, GETUTCDATE(), GETDATE()),UTC_COLUMN))
     WHEN Number = 4 THEN  DATEADD(mi,60,DATEADD(mi, DATEDIFF(mi, GETUTCDATE(), GETDATE()),UTC_COLUMN))
     WHEN Number = 5 THEN  DATEADD(mi,540,DATEADD(mi, DATEDIFF(mi, GETUTCDATE(), GETDATE()),UTC_COLUMN))
     WHEN Number = 6 THEN  DATEADD(mi,60,DATEADD(mi, DATEDIFF(mi, GETUTCDATE(), GETDATE()),UTC_COLUMN))

     END AS RECORDS_IN_FILTER

但是,当尝试在我收到消息“在预期条件的上下文中指定的非布尔类型的表达式,靠近')'的位置使用它时。显然,这是因为上述不兼容。

我正在尝试在 SSMS 中实现以下目标:

where (Number = 0 or Number is NULL)
(Number = 1 and ((UTC_COLUMN to GETDATE for Local)-30 minutes))
OR 
(Number = 2 and ((UTC_COLUMN to GETDATE for Local)-240 minutes))
OR 
(Number = 3 and ((UTC_COLUMN to GETDATE for Local)-1170 minutes))
OR 
(Number = 4 and ((UTC_COLUMN to GETDATE for Local)-60 minutes))
OR 
(Number = 3 and ((UTC_COLUMN to GETDATE for Local)-540 minutes))
OR 
(Number = 3 and ((UTC_COLUMN to GETDATE for Local)-60 minutes))

我需要它在几分钟内,因为查询将每分钟运行一次,因此将不断提取适合该过滤器的记录。

非常感谢您的帮助!

干杯,科里

标签: sqlssms

解决方案


我认为这就是你需要的改变,坚持#1?

Number = 1 and UTC_COLUMN BETWEEN DATEADD(minute, -30, GETUTCDATE()) AND GETUTCDATE()
  • 如果列在 UTC 日期之前大于 30 分钟,则小于 UTC 日期。
  • 这将返回一个布尔表达式。

我认为其他6个是不言自明的。


推荐阅读