sql - 将 datetime 列转换为 UTC 时间
问题描述
我想实现以下目标。
我有一个使用以下函数计算的日期时间列。
to_char(to_date(f_sta_date, 'YYYYMMDD') + (f_sta_time)/86400), 'YYYY-MM-DD HH24:MI:SS')
to_char(to_date(f_sta_date, 'YYYYMMDD') + (f_sta_time)/86400), 'YYYY-MM-DD HH24:MI:SS')
T1
f_sta_date f__sta_time f_sto_date f_sto_time DT_sta DT_sto
20191001 6689 20191001 7185 2019-10-01 01:54:49 2019-10-01 01:59:45
所需表
T1
f_sta_date f_sta_time_id f_sto_date f_sto_time_id DT_sta DT_sto DT_sta_UTC DT_sto_UTC
20191001 6689 20191001 7185 2019-10-01 01:54:49 2019-10-01 01:59:45
我可以在上面添加什么功能functions
来达到预期的效果?
解决方案
首先:to_char()
从日期返回一个字符串。所以如果你想要一个date
,不要使用它,即替换它:
to_char(to_date(f_sta_date, 'YYYYMMDD') + (f_sta_time)/86400), 'YYYY-MM-DD HH24:MI:SS')
至:
to_date(f_sta_date, 'YYYYMMDD') + f_sta_time/86400
然后:在管理时区时,您需要使用timestamp with time zone
数据类型而不是date
. 要将本地时间的日期(即会话的时区,由 定义SESSIONTIMEZONE
)转换为时间戳并在 UTC 获取相应的日期/时间,您可以执行以下操作:
cast(to_date(f_sta_date, 'YYYYMMDD') + f_sta_time/86400 as timestamp with time zone)
at time zone 'UTC'
您的查询:
select
to_date(f_sta_date, 'YYYYMMDD') + f_sta_time/86400 dt_sta,
to_date(f_sto_date, 'YYYYMMDD') + f_sto_time/86400 dt_sto,
cast(to_date(f_sta_date, 'YYYYMMDD') + f_sta_time/86400 as timestamp)
at time zone 'UTC' dt_sta_utc,
cast(to_date(f_sto_date, 'YYYYMMDD') + f_sto_time/86400 as timestamp)
at time zone 'UTC' dt_sto_utc
from t
推荐阅读
- java - Java 小程序可以在线使用了吗?
- c - 金字塔模式算法开发
- github - 如何在 GitHub 操作 YML 文件中添加评论?
- c++ - Codeforces 的廉价旅行 (466A) 问题
- python - 如何在 Tkinter 中默认选择菜单上的复选按钮?
- sql - 使用 oracle 将十进制转换为带前导零的十六进制
- sql - SQL Order by 多种场景
- azure - 如何从 Azure Active Directory 导入 Keycloak 中的用户?
- javascript - 如何在 Vuejs 中使用验证消息设置用户名的最大限制?
- mysql - 使用 Ctrl+C 停止 Debezium 连接器并再次重新启动连接器后连接器不起作用