如何从 Oracle 日期获取 unix 纪元?

Posted

技术标签:

【中文标题】如何从 Oracle 日期获取 unix 纪元?【英文标题】:How do I get the unix epoch from Oracle date? [duplicate] 【发布时间】:2017-08-22 18:32:28 【问题描述】:

在使用 Oracle SQL 获取 unix 纪元时间戳方面,有​​没有比这更好更快的解决方案?:

SQL> select (cast(sysdate as date) - cast(to_date('1970-01-01', 'YYYY-MM-DD') as date)) * 86400 as unixepoch from dual;

 UNIXEPOCH
----------
1490789604;

Oneliner 首选 ;)

【问题讨论】:

我已经发布了here 一些将时间戳转换为纳秒和纳秒转换为时间戳的方法。这些方法不受时区影响,精度为纳秒级。 【参考方案1】:

仅当您的数据库时区为 UTC 时,上述答案才正确。 Unix 时间始终采用 UTC。 无论配置如何,适用于任何数据库的正确答案是:

--Convert current time to epoch.
select (cast (systimestamp at time zone 'UTC' as date) - date '1970-01-01') * 86400
from dual

--Convert hard-coded timestamp to epoch.
select (cast (timestamp '2019-12-31 23:59:59' at time zone 'UTC' as date) - date '1970-01-01') * 86400
from dual;

【讨论】:

如果我有一个日期列而不是当前时间或硬编码时间戳怎么办?【参考方案2】:

您不需要将值转换为日期,因为它们已经是日期。

SELECT ( SYSDATE - DATE '1970-01-01' ) * 86400 AS unixepoch
FROM   DUAL;

【讨论】:

这不适用于除 UTC 以外的任何时区。

以上是关于如何从 Oracle 日期获取 unix 纪元?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 postgres 获取时间戳作为 Unix 纪元?

oracle 将 unix 纪元时间转换为日期

PostgreSQL:如何从 Unix 纪元转换为日期?

日期时间和熊猫之间的 Unix 纪元值不匹配

从 CalendarView 获取自 UNIX 纪元以来的 Millis 时间

获取表示当前日期的纪元时间戳范围