2016-04-15 63 views
1

如何查詢Orace日期字段的時間部分。即:Oracle查詢按時(而不是日期)

select * from mytable 
where 
date_column < '05:30:00' 

希望查詢返回由date_column表示的時間小於5:30的任何行,無論日期如何。

+0

這是一個日期列 –

回答

3

你可以嘗試這樣的:

select * from mytable 
where 
to_char(date_column, 'HH24:MI:SS') < '05:30:00' 
+0

似乎沒有工作... –

+0

對不起,它工作!我的錯。 –

+1

亞歷克斯的答案也有效,但這是最簡單的遵循伊姆霍謝謝。 –

2

你可以看到日期相差多少午夜,過濾器上:

select * from mytable 
where date_column - trunc(date_column) < 5.5/24 

date_column - trunc(date_column)計算會給你的一小部分一天,正常爲date arithmetic5.5/24是05:30時代的一小部分; 24小時內5.5小時。

如果該列是時間戳而不是日期,則會看到間隔數據類型作爲減法的結果。如果你喜歡,你可以使用an interval literal無論如何還是會發現很容易理解比5.5/24(或有更復雜的時間來比較,這是很難表達爲一個分數):

select * from mytable 
where date_column < trunc(date_column) + interval '0 05:30:00' day to second; 

這種方式圓你將列中的日期與截斷日期(即當天的午夜)進行比較,並在5小時30分鐘內添加該日期,即同一天的05:30。

快速演示在一個CTE簡單的數據,第三極輕微的變形,但他們都得到了相同的結果:

with mytable (date_column) as (
    select to_date('2016-04-15 05:29:29', 'YYYY-MM-DD HH24:MI:SS') from dual 
    union all select to_date('2016-04-14 05:29:29', 'YYYY-MM-DD HH24:MI:SS') from dual 
    union all select to_date('2016-04-15 05:30:30', 'YYYY-MM-DD HH24:MI:SS') from dual 
) 
select * from mytable 
where date_column < trunc(date_column) + 5.5/24; 

DATE_COLUMN  
------------------- 
2016-04-15 05:29:29 
2016-04-14 05:29:29 

不過,請注意這樣的列的任何操作將阻止指數爲用過的。如果你必須經常這樣做,可能值得添加一個虛擬列/索引來做這個計算。

+0

似乎沒有工作... –

+0

@MarcusLeon - 這不是很有幫助。當你運行它會發生什麼?你有什麼原始數據,你期望得到什麼結果,你會得到什麼? (將前兩個添加到問題中可能會有用)。我剛剛檢查過一些測試數據,它會在任何日期的05:30之前返回行。 –

+0

太難 to_char(date_column,'HH24:MI:SS')<'05:30:00'看起來很簡單 –

0

你需要將時間轉換回日期,否則你只是在做字符串比較。 Oracle並不是真的有一個聰明的方法來做到這一點。最簡單的方法是將兩個日期都投到同一天並進行比較。

I.e.

select * 
    from mytable 
where to_date ('01.01.2000 ' || to_char (date_column, 'hh24:mi:ss'), 'dd.mm.yyyy hh24:mi:ss') < 
      to_date ('01.01.2000' || '05:30:00', 'dd.mm.yyyy hh24:mi:ss')