2017-06-03 138 views
0

我有一個用於維護截斷時間的oracle表。這裏我們正在存儲各種證券的截止時間..目前我們是1970年1月1日的截止日期的截止日期。要求是用當前日期替換這個日期部分而不改變截止時間和時區部分。帶時區的Oracle時間戳:將日期部分替換爲當前日期

+0

你可以給一些示例行和清晰的預期輸出。 – Utsav

+0

@Utsav截止列(帶時區數據類型的時間戳)數據就像這樣「1970-01-01 18:00:00 -5:00」。 預期的輸出是「2017-06-03 18:00:09 -5:00」即今天的日期與截止列的時間戳部分 –

+1

這個請求有一個合乎邏輯的問題......「date」沒有很好的定義。應該使用哪個日期? 「這一刻」的日期是2017年6月6日,在美國和歐洲,但是在2017年6月7日,在日本和澳大利亞。由於您使用WITH TIME ZONE時間戳,這些時間戳與UTC偏移,因此從UTC獲取當前日期是有意義的,而不是從SYSDATE和類似的時間。 – mathguy

回答

1

你可以計算的天數和今天之間1970-01-01,然後添加作爲日常秒的時間間隔,以您的截斷時間戳值:

create table my_table (cutoff timestamp with time zone); 

insert into my_table values (timestamp '1970-01-01 18:00:00 -5:00'); 

select cutoff + numtodsinterval(trunc(sysdate) - date '1970-01-01', 'DAY') as adjusted 
from my_table; 

ADJUSTED       
----------------------------------- 
05-JUN-17 18.00.00.000000000 -05:00 

,或者如果你願意,您可以直接生成的時間間隔(如@mathguy指出):

select cutoff + (trunc(sysdate) - timestamp '1970-01-01 00:00:00') as adjusted 
from my_table; 

ADJUSTED     
------------------------- 
06-JUN-17 18:00:00 -05:00 

的-05:00時區偏移忽略夏令時間,當然,不過這似乎是你的原意。

+1

這個想法是正確的,但爲什麼截斷'SYSDATE'並減去一個日期,只是爲了將'NUMTODSINTERVAL'應用到結果?更好:截斷'SYSTIMESTAMP'並減去時間戳文字;結果可以直接添加到'CUTOFF'。 – mathguy

+1

另請參閱我給OP的說明,要求澄清...帶時區的時間戳與UTC偏移,因此使用用戶系統的「當前日期」(如SYSDATE或SYSTIMESTAMP中所示)似乎不自然;相反,應該首先將其轉換爲UTC,然後才截斷。最好,如果OP確認,因爲這不是一個「編碼」問題,這是一個「問題規範」問題。 – mathguy

+0

@mathguy - 不確定它有多大的區別,但確定。 'trunc(systimestamp)'仍然會給你一個日期(所以對'sysdate'沒有太大的好處?),但是從中減去時間戳仍然會給出一個時間間隔。增加了一個版本。我認爲第一個更清晰一點,但要麼知道datetime/interval算法是如何工作的,這似乎不是許多人給出的* 8- –

相關問題