2013-04-18 91 views
5

1小時我在甲骨文datetime柱(MM/DD/YYYY HH:MM:SS AM/PM),但是當我這樣做:減去日期時間,而超過一天

SELECT MAX(D_DTM)-1 FROM tbl1 

。它回來了一天。我如何從列中刪除一個小時而不是一天?

我也注意到,datetime記錄12AM樣子MM/DD/YYYY而不是MM/DD/YYYY 00:00:00;我不確定這是否重要。

+0

你如何觀看12AM值?它是通過SQLPlus還是前端語言(C#,PHP等等)? –

+0

使用蟾蜍,是前端的問題?我是新的Oracle env – user2061886

+0

它可能是一個TOAD的東西,但我不熟悉TOAD。如果列中的所有其他日期顯示時間分量,而「午夜」日期則不顯示,我認爲可以安全地假設「午夜」真的在那裏,而TOAD只是「有用地」隱藏它。可能有一個設置可以打開或關閉此功能,但這只是一個猜測。我知道.NET語言和PHP會識別時間部分 - 即使它是零 - 也可能幾乎所有其他語言都會。 –

回答

13

Randy's answer是好的,但你也可以使用間隔:

SELECT MAX(D_DTM)- interval '1' hour FROM tbl1 
+0

更好的答案國際海事組織,更清楚爲未來的編碼人員知道最新情況 – user2061886

4

是 - 日期以整數天爲單位。

如果你想要小時,你需要做一些數學 - 像-(1/24)

5

或者使用INTERVAL功能。它具有相同的結果,但我認爲它會讀取更清晰 - 這當然只是一個意見:)

SELECT MAX(D_DTM) - INTERVAL '1' HOUR FROM tbl1 

有關INTERVAL功能的好處是,你可以做的時間間隔是年,月,日,小時,處理DATE值時需要幾分鐘或幾秒鐘,但在處理月末日期時,月份間隔可能會非常棘手。

是的,在這個例子中圍繞1的引用是必需的。

您還可以使用Oracle特有NumToDSInterval功能,這是不太標準,但更靈活,因爲它接受變量,而不是常量:

SELECT MAX(D_DTM) - NUMTODSINTERVAL(1, 'HOUR') FROM tbl1 
2

使用間隔的另一種方法是

NUMTODSINTERVAL(number, expression) 

示例

NUMTODSINTERVAL(150, 'DAY') 
NUMTODSINTERVAL(1500, 'HOUR') 
NUMTODSINTERVAL(15000, 'MINUTE') 
NUMTODSINTERVAL(150000, 'SECOND') 

我把這個提起來beca使用它對於使用INTERVAL無法工作的情況非常有用。

4
select sysdate - numtodsinterval(1,'hour') from dual 
1

它很簡單。

SYSDATE - 5 /(24 * 60 * 60) - >減去5秒內從SYSTIME

SYSDATE - 5 /(24 * 60) - >從SYSTIME

SYSDATE減去5分鐘 - 5 /(24) - >減去SYSTIME

5小時因此

選擇(SYSDATE - (1/24))從雙

+0

你可以擴大一點你的答案,如爲什麼你使用除法? –

+0

@CodyGuldner該部門正在計算價值的一小部分天數。 (1小時是一天的1/24,所以5/24天是5小時。)減去然後減去一天。但是,就我個人而言,我會擔心浮點錯誤。 – jpmc26

+0

@ jpmc26想法是這樣的信息應該包含在答案中。 –