将 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
(我可能更愿意保留通常的纪元并进行额外的显式间隔添加...)
只有格式化为字符串才能显示。如果您需要将值传递到其他地方,则将其保留为带时区的时间戳,或者在必要时将其转换为普通时间戳甚至日期。
我在数据库中得到一个日期格式 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
(我可能更愿意保留通常的纪元并进行额外的显式间隔添加...)
只有格式化为字符串才能显示。如果您需要将值传递到其他地方,则将其保留为带时区的时间戳,或者在必要时将其转换为普通时间戳甚至日期。