sql - 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))
我需要它在几分钟内,因为查询将每分钟运行一次,因此将不断提取适合该过滤器的记录。
非常感谢您的帮助!
干杯,科里
解决方案
我认为这就是你需要的改变,坚持#1?
Number = 1 and UTC_COLUMN BETWEEN DATEADD(minute, -30, GETUTCDATE()) AND GETUTCDATE()
- 如果列在 UTC 日期之前大于 30 分钟,则小于 UTC 日期。
- 这将返回一个布尔表达式。
我认为其他6个是不言自明的。
推荐阅读
- json - 使用useEffect对axios返回数据做出反应“无法读取未定义的属性'numero'”
- scala - 如果列在行中为空,则获取列名和另一个列值
- visual-studio - windows vs2015创建cuda项目,release模式下默认开启/Zi选项。如何删除它?
- amazon-web-services - 尝试获取 Fargate 启动类型任务的任务 ID
- keycloak - Keycloak 使用不同的客户端重新验证经过身份验证的用户
- javascript - 为什么单击按钮时无法运行我的javascript
- html - 实现:更改浮动操作按钮设计/图像
- arcgis-js-api - 获取代理属性“访问器”是代理目标上的只读且不可配置的数据属性,但代理未返回其实际值
- c# - 如何通过 IServiceCollection 配置自适应采样
- reactjs - 如何在反应函数中关闭引导模式