如何查詢Orace日期字段的時間部分。即:Oracle查詢按時(而不是日期)
select * from mytable
where
date_column < '05:30:00'
希望查詢返回由date_column表示的時間小於5:30的任何行,無論日期如何。
如何查詢Orace日期字段的時間部分。即:Oracle查詢按時(而不是日期)
select * from mytable
where
date_column < '05:30:00'
希望查詢返回由date_column表示的時間小於5:30的任何行,無論日期如何。
你可以嘗試這樣的:
select * from mytable
where
to_char(date_column, 'HH24:MI:SS') < '05:30:00'
似乎沒有工作... –
對不起,它工作!我的錯。 –
亞歷克斯的答案也有效,但這是最簡單的遵循伊姆霍謝謝。 –
你可以看到日期相差多少午夜,過濾器上:
select * from mytable
where date_column - trunc(date_column) < 5.5/24
的date_column - trunc(date_column)
計算會給你的一小部分一天,正常爲date arithmetic。 5.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
不過,請注意這樣的列的任何操作將阻止指數爲用過的。如果你必須經常這樣做,可能值得添加一個虛擬列/索引來做這個計算。
似乎沒有工作... –
@MarcusLeon - 這不是很有幫助。當你運行它會發生什麼?你有什麼原始數據,你期望得到什麼結果,你會得到什麼? (將前兩個添加到問題中可能會有用)。我剛剛檢查過一些測試數據,它會在任何日期的05:30之前返回行。 –
太難 to_char(date_column,'HH24:MI:SS')<'05:30:00'看起來很簡單 –
你需要將時間轉換回日期,否則你只是在做字符串比較。 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')
這是一個日期列 –