SQL 从时间戳中提取小时

Posted

技术标签:

【中文标题】SQL 从时间戳中提取小时【英文标题】:SQL extract hour from timestamp 【发布时间】:2017-04-05 08:54:09 【问题描述】:

此查询:select EXTRACT(HOUR FROM 1435047532) as hour from TABLENAME; 返回此错误:“提取源的提取字段无效”。 我正在尝试从给定的时间戳中提取小时。也许问题是时间戳字段的格式是 NUMBER 而不是 TIMESTAMP?

【问题讨论】:

1435047532 只是一个数字,您需要定义如何将其解释为日期/时间。例如。是自 Unix 纪元以来的秒数还是自 1600-01-01T00:00:00 以来的 10ns 间隔? @Richard 我编辑了指定格式为 NUMBER amd 的问题,询问这是否是问题所在。所以你是对的,它是。这个数字是从 Unix 时代开始的秒数。如何将它们转换为正确的格式? 当你真的想要一个时间戳的时候,你为什么还要存储这样一个unix数字呢?我建议您更改表格设计并切换到date(实际上是一个日期时间)或timestamp(即创建一个新列,计算ist 值并删除旧列)。 @ThorstenKettner 我做不到。我无权更改结构上的任何内容,我可以查询。 如果有人犯了设计错误而其他人因此受苦,那就太糟糕了。你至少应该让他们知道这一点,以便他们知道并考虑改变这一点。 【参考方案1】:

您可以使用以下方法将数字 seconds-since-epoch 时间转换为 TIMESTAMP 类型:

TIMESTAMP '1970-01-01 00:00:00' + NUMTODSINTERVAL( your_time_since_epoch, 'SECOND' )

所以要知道时间:

SELECT EXTRACT( HOUR FROM TIMESTAMP '1970-01-01 00:00:00'
                          + NUMTODSINTERVAL( 1435047532, 'SECOND' ) )
FROM   DUAL;

如果您需要处理闰秒,则需要to create a function/package to handle this。

【讨论】:

我们已经讨论过了。 Unix 时间戳不支持闰秒。但是,您可能会认为 1970-01-01 00:00:00 始终以 UTC 时间给出,而不是本地时间。这不是对您的答案的批评,而是根据特定需求对其进行调整的提示。 @WernfriedDomscheit 如果在特定时区(即 PST)中需要时间戳,则可以使用 FROM_TZ( TIMESTAMP '1970-01-01 00:00:00' + NUMTODSINTERVAL( your_time_since_epoch, 'SECOND' ), 'UTC' ) AT TIME ZONE 'PST' 更改它。【参考方案2】:

试试这个

select extract(hour from (select to_date('19700101', 'YYYYMMDD') 
+ ( 1 / 24 / 60 / 60 ) * 1435047532 from dual)) from dual

【讨论】:

你会得到ORA-30076: invalid field for extract source。如果您想提取小时数,您需要使用TIMESTAMP

以上是关于SQL 从时间戳中提取小时的主要内容,如果未能解决你的问题,请参考以下文章

从时间戳中提取时间?

我正在使用 Oracle SQL Developer 并希望从时间戳中提取星期几。我的语法是不是正确?

Spark Sql:从时间戳按小时间隔分区

如何在sequelize ORM中使用从时间戳中选择并提取日期到月份和年份?

从 MYSQL 上的时间戳中提取日/月/年

pandas:从时间戳中提取日期和时间