我有一个很大的表,其中有一个存储在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))
我需要在几分钟之内,因为查询将每分钟运行一次,因此将不断提取适合该过滤器的记录。
非常感谢您的帮助!
干杯, 柯瑞
答案 0 :(得分:1)
我认为这就是您需要的变化,坚持#1吗?
Number = 1 and UTC_COLUMN BETWEEN DATEADD(minute, -30, GETUTCDATE()) AND GETUTCDATE()
我认为其他6个是自我解释。