首页 > 解决方案 > 将 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来达到预期的效果?

标签: sqloracle

解决方案


首先: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

推荐阅读