【问题标题】:convert sysdate to 13 digit number oracle sql [duplicate]将sysdate转换为13位数字oracle sql [重复]
【发布时间】:2017-08-08 04:28:48
【问题描述】:

我需要在 oracle 中将 sysdate 转换为 13 位数字(Unix 时间戳号)。 请为此分享sql。

示例:1486015200000 日期:02/02/2017

对于号码参考,请在下面的链接中使用 1486015200000 http://www.timestampconvert.com/

【问题讨论】:

  • 请发一个例子。如果当前时间是 3/16/2017 3:52:PM EST,那么 13 位数字是什么?为什么?
  • 日期:02/02/2017 号码:1486015200000
  • 为什么是那个日期的数字?

标签: sql oracle


【解决方案1】:

unix 生成时间戳的方式,它是自 1970 年 1 月 1 日协调世界时 (UTC) 午夜以来经过的秒数。

你应该可以使用

select (
  timestamp '1970-01-01 00:00:00 GMT' + numtodsinterval(1486015200000 /1000, 'SECOND'))
   at LOCAL 
from dual;

NUMTODSINTERVAL doc

【讨论】:

  • 可能考虑时区的唯一正确答案。但是我认为问题是相反的。
  • @WernfriedDomscheit - 我不明白关于“时区”的评论。我的回答肯定包含对此的评论 - 并且还指出在 Oracle 中 DATE 数据类型不包含有关“时区”的信息,所以我不确定你的意思。
【解决方案2】:

原则上这很容易:选择任何日期。减去日期文字date '1970-01-01'。将差值用括号括起来,然后乘以 86400000。

即:日期差异(在 Oracle 中)以天为单位。一天有 24 * 24 * 60 = 86,400 秒和 86,400,000 毫秒。 13 位“unix 时间”是自 UTC 时间 1970 年 1 月 1 日午夜以来经过的毫秒数。

您链接到的网站上的计算延迟了 6 小时,所以我假设您住在美国中部时区的某个地方(或者可能在同一时区的其他地方,在北美、中美或南美) .该网站假定输入是在您的时区。在 Oracle 中,日期是抽象的,它们不在“时区”中。

select sysdate, (sysdate - date '1970-01-01') * 86400000 as unix_time from dual;

SYSDATE              UNIX_TIME
-------------------  -------------
03/16/2017 15:17:32  1489677452000

【讨论】:

  • 只有当你的数据库服务器在UTC时区运行时,这个查询才会返回正确的结果,否则是错误的。在这种情况下,您必须先将 sysdate 转换为 UTC(或将 '1970-01-01 00:00:00 UTC' 转换为本地时间)
  • 网页timestampconvert.com 进行了正确的转换,它指出是当地时间。当我(住在欧洲)输入 Unix 时间 '00' 时,我得到的结果是本地时间 '1970-01-01 01:00:00' 等于 '1970-01-01 00:00:00 UTC'跨度>
  • @WernfriedDomscheit - 我同意网站进行了正确的转换。我的观点(我也许应该更明确一点)是将 Oracle 日期转换为 Unix 时间的整个概念是无效的。 Unix 时间是“在特定时区”。甲骨文日期不是。根据服务器时区转换 Oracle 日期绝对没有意义; Oracle 日期与服务器时区或任何其他时区无关。有意义的是在 Unix 时间和带有时区(或本地时区)的 Oracle 时间戳之间进行转换。
  • @WernfriedDomscheit - 如果您不同意上述评论,那么 this 就是我们不同意的内容,而不是其他内容。 (重复一遍:也许你不同意我的观点,即 Oracle 日期和没有时区的时间戳到 Unix 时间之间的转换一开始是没有意义的。)
  • 是的,事实上DATE 值(以及SYSDATE)没有任何时区。但是,实际上,当您有时间没有任何时区信息时,这意味着(几乎)总是“当地时间”。因此,将DATE 值视为当地时间并相应地转换它们是有意义的。但这只是我的看法。
【解决方案3】:

这应该可行:

SELECT (COLUMN_WITH_ORACLE_DATE_VALUE - TO_DATE('1970-01-01', 'YYYY-MM-DD')) * 86400000 FROM DUAL;

示例:

SELECT (TO_DATE('02/02/2017','MM/DD/YYYY') - TO_DATE('01/01/1970', 'MM/DD/YYYY')) * 86400000 FROM DUAL;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 2021-08-04
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多