UTC语句中的UTC到本地转换

时间:2018-07-11 23:14:49

标签: sql ssms

我有一个很大的表,其中有一个存储在UTC中的datetime列。我见过很多很多帖子,询问如何从UTC转换为本地,但是所有这些都表明它是在select语句中完成的,而不是在何处。

我已经在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))

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

非常感谢您的帮助!

干杯, 柯瑞

1 个答案:

答案 0 :(得分:1)

我认为这就是您需要的变化,坚持#1吗?

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

我认为其他6个是自我解释。