簡體   English   中英

Oracle按時間查詢(而不是日期)

[英]Oracle query on time (and not date)

如何僅查詢Orace日期字段的時間部分。 即:

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算術正常。 5.5/24是一天中以05:30的時間表示的分數; 24小時中有5.5小時。

如果該列是時間戳而不是日期,那么您會看到間隔數據類型是減法的結果。 如果願意,可以使用區間字面量 ,或者比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

請注意,盡管像這樣對列進行任何操作都會阻止使用索引。 如果必須定期執行此操作,則值得添加一個虛擬列/索引來執行該計算。

您需要將時間恢復為最新狀態,否則您只是在進行字符串比較。 Oracle確實沒有做到這一點的聰明方法。 將兩個日期都轉換為同一天並進行比較最簡單。

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')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM