簡體   English   中英

where 條件中的 OR 子句

[英]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.

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