2016-09-06 95 views
0

我有一個日期的值 - 08.06.16 19:56:20,473000000 orcle db。Oracle時間戳舍入

CR_DATE - TIMESTAMP(6) 

我需要日期被截斷到前一小時的頂部並轉換爲時代格式。例如,如果日期如上所述那麼它應該四捨五入到08.06.16 19:00:00,然後轉換爲時代,這應該給我最後的o/p爲1465412400

我可以使用下面的查詢來更改以時代格式,但四捨五入到最近的小時不起作用。

ROUND((CAST(CR_DATE AS DATE) - DATE '1970-01-01') * 24 * 60 * 60, 0) AS creationDate 

如果我使用

select CR_DATE,TRUNC(CREATION_DATE, 'HH24') AS creationDate 

然後我得到的價值爲16年8月6日和HH:MM的詳細信息被截斷。

在DB上設置NLS_TIMESTAMP_FORMAT是DD.MM.RR HH24:MI:SSXFF

有人可以幫助我解決這個不改變NSL格式?

+0

您說「四捨五入到最接近的小時」,但您的示例似乎表明您要截斷到前一小時的頂部。哪兩個是正確的。 'trunc(creation_date,'HH24')'將返回一個截斷爲小時的'date'。您的客戶可能不會顯示時間部分,但它仍然存在。 –

+0

感謝您關注此問題。是截斷到前幾小時的頂部,實際上是到最近的小時。爲這個錯誤道歉。但是,如何隨着時間的推移獲得價值。我不想讓時間部分完全散發出去。 – RandomQuestions

+0

「到實際到最近的小時」是什麼意思?這聽起來像我們回到舍入不截斷 –

回答

0

這聽起來像你想

ROUND((TRUNC(CAST(CR_DATE AS DATE), 'HH24') - 
      DATE '1970-01-01') * 24 * 60 * 60, 0) AS creationDate 

trunc(some_date, 'HH24')將返回截斷到最接近的小時的日期。您的客戶端可能默認不顯示時間組件,但它仍然存在。

with x as (
    select timestamp '2016-06-08 19:56:20.473' cr_date 
    from dual 
) 
select ROUND((TRUNC(CAST(CR_DATE AS DATE), 'HH24') - 
       DATE '1970-01-01') * 24 * 60 * 60, 0) AS creationDate 
    from x; 
+0

謝謝你...這工作得很好。 – RandomQuestions