在Oralce PL/SQL中有没有一种方法可以将当前时间戳作为一个数字来获取?
类似于“1582185277302”
发布于 2020-02-20 17:44:56
您可以将当前日期/时间转换为纪元时间戳,如下所示:
(sysdate - date '1970-01-01') * 60 * 60 * 24这给出了自1970年1月1日以来的秒数。
如果您想要以毫秒为单位的结果,则:
(cast(systimestamp as date) - date '1970-01-01') * 24 * 60 * 60 * 1000
+ mod( extract(second from systimestamp), 1) * 1000 发布于 2020-02-20 18:11:40
Unix时间戳采用UTC时区。如果您的时间戳采用UTC时区,则可以使用:
( TRUNC( your_timestamp, 'MI' ) - DATE '1970-01-01' ) * 24 * 60 * 60 * 1000
+ EXTRACT( SECOND FROM your_timestamp ) * 1000如果你的时间戳有一个时区,那么:
( TRUNC( your_timestamp AT TIME ZONE 'UTC', 'MI' ) - DATE '1970-01-01' ) * 24 * 60 * 60 * 1000
+ EXTRACT( SECOND FROM your_timestamp ) * 1000如果你需要处理闰秒,那么你可以使用this answer。
发布于 2020-02-20 18:09:16
如果从systimestamp中减去一个固定的时间戳,就会得到一个时间间隔:
select systimestamp - timestamp '1970-01-01 00:00:00 UTC' as diff
from dual;
DIFF
----------------------
+18312 10:05:29.674905然后,您可以使用内联视图或CTE提取和操作其中的元素以获取纪元时间,以避免重复间隔生成:
with t (diff) as (
select systimestamp - timestamp '1970-01-01 00:00:00 UTC'
from dual
)
select trunc(1000 * (
extract (day from diff) * 24 * 60 *60
+ extract (hour from diff) * 60 * 60
+ extract (minute from diff) * 60
+ extract (second from diff)
)) as epoch
from t;
EPOCH
-------------------
1582193129829将所有提取加在一起得到包括分数在内的总秒数;乘以1000得到毫秒,但仍然有分数(取决于您的平台支持的精度);截断只给出毫秒。
这会将时区考虑在内(纪元时间应该从UTC开始计算);但不允许使用闰秒。
作为进一步的演示,使用任意时区的固定时间来获得问题中的结果:
with t (diff) as (
select timestamp '2020-02-20 02:54:37.302789 America/New_York' - timestamp '1970-01-01 00:00:00 UTC'
from dual
)
select trunc(1000 * (
extract (day from diff) * 24 * 60 *60
+ extract (hour from diff) * 60 * 60
+ extract (minute from diff) * 60
+ extract (second from diff)
)) as epoch
from t;
EPOCH
-------------------
1582185277302https://stackoverflow.com/questions/60316954
复制相似问题