2017-04-05 265 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