2017-04-05 263 views
0

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

+3

1435047532只是一个数字,您需要定义它是如何解释为日期/时间。例如。自从1600-01-01T00:00:00以来,它是Unix时代以来的秒数还是10ns? – Richard

+0

@Richard我编辑的问题指定的格式是NUMBER和问这是否是问题。所以你是对的,它的。这个数字是来自Uniix时代的秒数。如何将它们转换为正确的格式? – Caramelleamare

+0

为什么你甚至在你真的想要一个时间戳的时候存储这样一个unix数字?我建议你改变你的表格设计并切换到'date'(这是一个真正的日期时间)或'timestamp'(即创建一个新列,计算ist值并删除旧列)。 –

回答

0

试试这个

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

您将得到'ORA-30076:提取源的无效字段'。如果你想提取小时数,你需要使用'TIMESTAMP'。 – MT0

1

你可以用时间转换您的数字纪元以来秒至一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

+1

我们已经讨论过了。 Unix时间戳不支持闰秒。但是,您可能会认为'1970-01-01 00:00:00'总是以UTC时间给出,而不是本地。这不是对你的回答的批评,而是根据具体需要调整它的提示。 –

+1

@WernfriedDomscheit如果在特定时区(即PST)需要时间戳,那么可以使用'FROM_TZ(TIMESTAMP'1970-01-01 00:00:00'+ NUMTODSINTERVAL(your_time_since_epoch,'SECOND'),' UTC')在时区'PST'。 – MT0