[英]OR clause in where conditions
嗨,我正在嘗試編寫我需要三個不同日期的數據的查詢,所以我正在像這樣編寫下面的查詢,但我無法正確獲取數據
SELECT tr_name
FROM RT_TRANSAPORT RT
WHERE
(RT.TR_DATE BETWEEN TO_DATE('08/11/2021','dd/mm/yyyy') AND TO_DATE('08/11/2021','dd/mm/yyyy'))
OR
(RT.KM_DATE BETWEEN TO_DATE('08/11/2021','dd/mm/yyyy') AND TO_DATE('08/11/2021','dd/mm/yyyy'))
OR
(FU.TY_DATE BETWEEN TO_DATE('08/11/2021','dd/mm/yyyy') AND TO_DATE('08/11/2021','dd/mm/yyyy'))
OR
(FU.AT_DATE BETWEEN TO_DATE('08/11/2021','dd/mm/yyyy') AND TO_DATE('08/11/2021','dd/mm/yyyy'))
請告訴我哪里出錯了
首先:當 Oracle 調用數據類型DATE
,它實際上是一個日期時間,即它由日期部分和時間部分組成。 時間部分可以設置為00:00:00,可以認為是午夜的那一天,也可以是不分時間的那一天。 這意味着這有待解釋。
您有一個名為TR_DATE
的列。 您是否僅存儲日期(即時間設置為 00:00:00)? 或者這是用詞不當(而應該稱為 tr_datetime)? 如果你真的存儲了一個日期時間,那么
rt.tr_date BETWEEN DATE '2021-11-08' AND DATE '2021-11-08'
只會檢索時間設置為午夜的行,而忽略該日期的所有其他行。 日期時間 '2021-11-08 00:00:01' 將被解雇。
為了解決這個問題,我們通常這樣看日期:
rt.tr_date >= DATE '2021-11-08' AND rt.tr_date < DATE '2021-11-09'
無論您是否存儲時間部分,這都為我們提供了完整的“2021-11-08”。
你說你的查詢得到一個起始日期和一個截止日期。 因此:
rt.tr_date >= :from_date AND rt.tr_date < :to_date + INTERVAL '1' DAY
在 Oracle 中, DATE
是一種二進制數據類型,它始終具有組件年、月、日、小時、分鍾和秒。 客戶端應用程序通常只會顯示年-月-日組件,但時間組件仍然始終存在(即使您沒有顯示它們)。
如果要存儲帶有時間組件的DATE
,則需要匹配當天的整個時間范圍,並且可以使用以下方法執行此操作:
SELECT tr_name
FROM RT_TRANSAPORT RT
WHERE ( RT.TR_DATE >= TO_DATE('08/11/2021','dd/mm/yyyy')
AND RT.TR_DATE < TO_DATE('08/11/2021','dd/mm/yyyy') + INTERVAL '1' DAY)
OR ( RT.KM_DATE >= TO_DATE('08/11/2021','dd/mm/yyyy')
AND RT.KM_DATE < TO_DATE('08/11/2021','dd/mm/yyyy') + INTERVAL '1' DAY)
OR ( FU.TY_DATE >= TO_DATE('08/11/2021','dd/mm/yyyy')
AND FU.TY_DATE < TO_DATE('08/11/2021','dd/mm/yyyy') + INTERVAL '1' DAY)
OR ( FU.AT_DATE >= TO_DATE('08/11/2021','dd/mm/yyyy')
AND FU.AT_DATE < TO_DATE('08/11/2021','dd/mm/yyyy') + INTERVAL '1' DAY)
或者
SELECT tr_name
FROM RT_TRANSAPORT RT
WHERE ( RT.TR_DATE >= DATE '2021-11-08'
AND RT.TR_DATE < DATE '2021-11-08' + INTERVAL '1' DAY)
OR ( RT.KM_DATE >= DATE '2021-11-08'
AND RT.KM_DATE < DATE '2021-11-08' + INTERVAL '1' DAY)
OR ( FU.TY_DATE >= DATE '2021-11-08'
AND FU.TY_DATE < DATE '2021-11-08' + INTERVAL '1' DAY)
OR ( FU.AT_DATE >= DATE '2021-11-08'
AND FU.AT_DATE < DATE '2021-11-08' + INTERVAL '1' DAY)
嘗試使用 TRUNC 函數,
樣本,
TRUNC(RT.TR_DATE)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.