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

Convert EPOCH date to timestamp in oracle SQL

我在数据库中得到一个日期格式 EPOCH table - "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(印度尼西亚雅加达) 最终预期输出是 - “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

然后你可以加上小时、分钟和秒(或者改天再减去一秒):

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

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

db<>fiddle

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