Oracle 中时间戳转换为 EPOCH 时间 SQL
Timestamp conversion to EPOCH time in Oracle SQL
我在 table“22/03/2022 06:59:59”
中的一列中输入了日期
我需要转换成 EPOCH 时间 -
预期输出 - “1647932399”时区(印度尼西亚雅加达)
参考 link- https://www.epochconverter.com/
输入数据的时区为 - UTC +7:00(雅加达)
尝试过这个-SQL CODE
SELECT (CAST(SYS_EXTRACT_UTC(to_timestamp('22/03/2022 06:59:59','dd/mm/yyyy HH:MI:SS' )) AS DATE) - TO_DATE('01/01/1970','DD/MM/YYYY')) * 24 * 60 * 60 FROM DUAL;
显示的结果是1647907199
但是没有得到预期的输出
1647932399 是 2022-03-22 06:59:59 UTC 的纪元。您的开始时间是 22-03-22 06:59:59 Asia/Jakarta,也就是 22-03-21 23:59:59 UTC,而它的纪元是 1647907199 - 这就是您得到的。所以你的结果是正确的;但有风险。
您依赖于隐式转换。
to_timestamp('22/03/2022 06:59:59','dd/mm/yyyy HH:MI:SS')
给你一个简单的时间戳,没有时区信息。然后当您执行 SYS_EXTRACT_UTC(...)
时,普通时间戳将使用您的 session 时区隐式转换为带时区的时间戳 - 看起来恰好是雅加达。所以它有效 - 对你来说,在这个 session 中。如果您更改 session 时区,或者更可能是其他人从具有不同时区的 session 运行相同的代码,那么结果将会不同。
更明确地说,您可以将字符串转换为纯时间戳,然后声明它表示雅加达时间,然后将其转换为 UTC:
sys_extract_utc(from_tz(to_timestamp('22/03/2022 06:59:59', 'DD/MM/YYYY HH24:MI:SS'), 'Asia/Jakarta'))
21-MAR-22 23.59.59.000000000 UTC
然后基本上有两种方法可以将其转换为纪元号;将其转换为一个日期,将 1970-01-01 减去一个日期,然后操纵结果天数(如您的问题):
select
round(
(
cast(
sys_extract_utc(from_tz(to_timestamp('22/03/2022 06:59:59', 'DD/MM/YYYY HH24:MI:SS'), 'Asia/Jakarta'))
as date)
- date '1970-01-01'
) * 24 * 60 * 60
) as result
from dual;
1647907199
或者留作时间戳,减去1970-01-01作为时间戳,操作得到的区间:
select
(extract(day from diff) * 24 * 60 * 60)
+ (extract(hour from diff) * 60 * 60)
+ (extract(minute from diff) * 60)
+ extract(second from diff)
as result
from (
select sys_extract_utc(from_tz(to_timestamp('22/03/2022 06:59:59', 'DD/MM/YYYY HH24:MI:SS'), 'Asia/Jakarta'))
- timestamp '1970-01-01 00:00:00' as diff
from dual
);
1647907199
请注意,无论哪种方式,您都可以通过截断数字或仅提取天数,而无需明确减去 23:59:59 部分,从而轻松获得作为上一个问题基础的简短结果。要么给你 19072.
我在 table“22/03/2022 06:59:59”
中的一列中输入了日期我需要转换成 EPOCH 时间 - 预期输出 - “1647932399”时区(印度尼西亚雅加达)
参考 link- https://www.epochconverter.com/
输入数据的时区为 - UTC +7:00(雅加达)
尝试过这个-SQL CODE
SELECT (CAST(SYS_EXTRACT_UTC(to_timestamp('22/03/2022 06:59:59','dd/mm/yyyy HH:MI:SS' )) AS DATE) - TO_DATE('01/01/1970','DD/MM/YYYY')) * 24 * 60 * 60 FROM DUAL;
显示的结果是1647907199
但是没有得到预期的输出
1647932399 是 2022-03-22 06:59:59 UTC 的纪元。您的开始时间是 22-03-22 06:59:59 Asia/Jakarta,也就是 22-03-21 23:59:59 UTC,而它的纪元是 1647907199 - 这就是您得到的。所以你的结果是正确的;但有风险。
您依赖于隐式转换。
to_timestamp('22/03/2022 06:59:59','dd/mm/yyyy HH:MI:SS')
给你一个简单的时间戳,没有时区信息。然后当您执行 SYS_EXTRACT_UTC(...)
时,普通时间戳将使用您的 session 时区隐式转换为带时区的时间戳 - 看起来恰好是雅加达。所以它有效 - 对你来说,在这个 session 中。如果您更改 session 时区,或者更可能是其他人从具有不同时区的 session 运行相同的代码,那么结果将会不同。
更明确地说,您可以将字符串转换为纯时间戳,然后声明它表示雅加达时间,然后将其转换为 UTC:
sys_extract_utc(from_tz(to_timestamp('22/03/2022 06:59:59', 'DD/MM/YYYY HH24:MI:SS'), 'Asia/Jakarta'))
21-MAR-22 23.59.59.000000000 UTC
然后基本上有两种方法可以将其转换为纪元号;将其转换为一个日期,将 1970-01-01 减去一个日期,然后操纵结果天数(如您的问题):
select
round(
(
cast(
sys_extract_utc(from_tz(to_timestamp('22/03/2022 06:59:59', 'DD/MM/YYYY HH24:MI:SS'), 'Asia/Jakarta'))
as date)
- date '1970-01-01'
) * 24 * 60 * 60
) as result
from dual;
1647907199
或者留作时间戳,减去1970-01-01作为时间戳,操作得到的区间:
select
(extract(day from diff) * 24 * 60 * 60)
+ (extract(hour from diff) * 60 * 60)
+ (extract(minute from diff) * 60)
+ extract(second from diff)
as result
from (
select sys_extract_utc(from_tz(to_timestamp('22/03/2022 06:59:59', 'DD/MM/YYYY HH24:MI:SS'), 'Asia/Jakarta'))
- timestamp '1970-01-01 00:00:00' as diff
from dual
);
1647907199
请注意,无论哪种方式,您都可以通过截断数字或仅提取天数,而无需明确减去 23:59:59 部分,从而轻松获得作为上一个问题基础的简短结果。要么给你 19072.