【问题标题】:I need help figuring out this oracle db timestamp [duplicate]我需要帮助找出这个 oracle 数据库时间戳 [重复]
【发布时间】:2020-03-18 09:52:08
【问题描述】:

我在 oracle 数据库上运行查询,并试图获取此特定事件的开始时间。日期只是作为数字存储在表中,我能够检索它的唯一方法是使用TO_CHAR(TIMEFRAME_START)。这给了我1574402400 的输出。

我知道这应该对应于 11/21/2019 11:00:00 PM MST 基于提取相同信息的不同应用程序,但我不知道它是如何进行这种转换的。我需要检索其他行并且需要能够将该输出转换为标准日期格式。

有人对我如何准确格式化原始输出有任何想法吗?

【问题讨论】:

  • 数字与时间戳如何对应?是从某个日期开始的秒数吗?
  • Unix 时间戳?
  • TO_DATE('19700101','yyyymmdd') + ((1574402400)/24/60/60)

标签: c# sql oracle


【解决方案1】:

假设该数字代表一个unix时间戳,您可以使用以下表达式将其转换为日期:

to_date('1970-01-01', 'yyyy-mm-dd') + timeframe_start / 60 /60 / 24

理由:

  • unix 纪元从 1970 年 1 月 1 日开始

  • 在 Oracle 中,您可以将小数天数添加到日期

所以基本上我们会将纪元时间戳除以 60(每分钟秒数)、60(每小时分钟数)和 24(每天小时数)来转换为天数,然后将其添加到表示纪元开始。

然后您可以使用to_char() 将生成的日期格式化为所需的字符串格式:

to_char(
    to_date('1970-01-01', 'yyyy-mm-dd') + timeframe_start / 60 /60 / 24,
    'mm/dd/yyyy hh12:mi:ss am'
)

【讨论】:

  • 感谢您的快速回复!这非常有效。现在我只需要从 UTC 转换为本地时间。这可以集成到这个函数中还是应该在返回日期后在一个方法中处理它?
【解决方案2】:

您应该执行以下操作,因为这是一个 UNIX 时间戳:

TO_CHAR(TO_DATE('19700101000000','YYYYMMDDHH24MISS') + numtodsinterval(TO_CHAR(TIMEFRAME_START), 'SECOND'), 'MM/DD/YYYY HH:MI:SS AM')

【讨论】:

  • 谢谢你!这个解决方案也很有效,但我最终使用了 GMB 的答案,因为它稍微干净一些。
  • 不用担心。有一些方法可以进行这种转换,所以任何适合你的方法。
猜你喜欢
  • 1970-01-01
  • 2018-12-22
  • 2015-11-13
  • 2018-07-24
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-09
相关资源
最近更新 更多