繁体   English   中英

将 EPOCH 日期转换为 oracle 中的时间戳 SQL

[英]Convert EPOCH date to timestamp in oracle SQL

我在数据库表中得到一个日期格式 EPOCH - “19072”

首先,我需要转换为时间 - 21/03/2022 并连接 23:59:59 日期转换参考 - https://www.timeanddate.com/date/dateadded.html?d1=1&m1=1&y1=1970&type=add&ay= &am=&aw=&ad=19072&rec=

现在我需要将“21/03/2022 23:59:59”转换为 UTC +7:00(印度尼西亚雅加达)最终预计 output 是 - “22/03/2022 06:59:59”

您可以直接向日期添加天数:

select date '1970-01-01' + 19072 from dual;
21-MAR-22

或者在时间戳中添加一个时间间隔; 这可能更合适,因为无论如何您都需要以带时区的时间戳结束,因此它以 UTC 值开头:

select timestamp '1970-01-01 00:00:00 UTC' + (19072 * interval '1' day) from dual;
21-MAR-22 00.00.00.000000000 PM UTC

然后你可以添加小时、分钟和秒(或 go 提前一天并减去一秒):

select 
  timestamp '1970-01-01 00:00:00 UTC'
    + (19072 * interval '1' day)
    + (23 * interval '1' hour)
    + (59 * interval '1' minute)
    + (59 * interval '1' second)
from dual;
21-MAR-22 11.59.59.000000000 PM UTC

并使用at time zone转换为您的目标时区:

select
  (
    timestamp '1970-01-01 00:00:00 UTC'
      + (19072 * interval '1' day)
      + (23 * interval '1' hour)
      + (59 * interval '1' minute)
      + (59 * interval '1' second)
  )
  at time zone 'Asia/Jakarta'
from dual;
22-MAR-22 06.59.59.000000000 AM ASIA/JAKARTA

然后出于显示目的,转换为所需格式的字符串:

select
  to_char(
    (
      timestamp '1970-01-01 00:00:00 UTC'
        + (19072 * interval '1' day)
        + (23 * interval '1' hour)
        + (59 * interval '1' minute)
        + (59 * interval '1' second)
    )
    at time zone 'Asia/Jakarta',
    'DD/MM/YYYY HH24:MI:SS'
  ) as result
from dual;
22/03/2022 06:59:59

你可以通过修改你的时代来简化一点,虽然它看起来有点奇怪:

select
  to_char(
    (
      timestamp '1970-01-01 23:59:59 UTC'
        + (19072 * interval '1' day)
    )
    at time zone 'Asia/Jakarta',
    'DD/MM/YYYY HH24:MI:SS'
  ) as result
from dual;
22/03/2022 06:59:59

(我可能更愿意保留通常的纪元并进行额外的显式间隔添加......)

数据库<>小提琴

仅格式化为字符串以显示它。 如果您需要将值传递到其他地方,则将其保留为带时区的时间戳,或者在必要时将其转换为普通时间戳甚至日期。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM