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 并希望从时间戳中提取星期几。我的语法是不是正确?