简体   繁体   English

where 条件中的 OR 子句

[英]OR clause in where conditions

Hi i am trying write the query where i need data for three different dates so i am writing the query below like this but i am not able fetch the data correctly嗨,我正在尝试编写我需要三个不同日期的数据的查询,所以我正在像这样编写下面的查询,但我无法正确获取数据

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

please tell me where it went wrong请告诉我哪里出错了

To start with: while Oracle calls the data type DATE , it is actually a datetime, ie it consists of a date part and a time part.首先:当 Oracle 调用数据类型DATE ,它实际上是一个日期时间,即它由日期部分和时间部分组成。 The time part can be set to 00:00:00, which can be considered the day at midnight or the day regardless of time.时间部分可以设置为00:00:00,可以认为是午夜的那一天,也可以是不分时间的那一天。 This means that this is subject to interpretation.这意味着这有待解释。

You have a column called TR_DATE .您有一个名为TR_DATE的列。 Are you storing dates only (ie time set to 00:00:00)?您是否仅存储日期(即时间设置为 00:00:00)? Or is this a misnomer (and should rather be called tr_datetime)?或者这是用词不当(而应该称为 tr_datetime)? If you actually store a datetime, then如果你真的存储了一个日期时间,那么

rt.tr_date BETWEEN DATE '2021-11-08' AND DATE '2021-11-08'

will only retrieve rows with a time set to midnight exactly and neglect all other rows at that date.只会检索时间设置为午夜的行,而忽略该日期的所有其他行。 A datetime '2021-11-08 00:00:01' will already get dismissed.日期时间 '2021-11-08 00:00:01' 将被解雇。

In order to deal with this we usually look at dates thus:为了解决这个问题,我们通常这样看日期:

rt.tr_date >= DATE '2021-11-08' AND rt.tr_date < DATE '2021-11-09'

which gets us the complete '2021-11-08', no matter if you store time parts or not.无论您是否存储时间部分,这都为我们提供了完整的“2021-11-08”。

You say that your query gets a from date and a to date.你说你的查询得到一个起始日期和一个截止日期。 Hence:因此:

rt.tr_date >= :from_date AND rt.tr_date < :to_date + INTERVAL '1' DAY

In Oracle, a DATE is a binary data type that always has the components year, month, day, hour, minute and second.在 Oracle 中, DATE是一种二进制数据类型,它始终具有组件年、月、日、小时、分钟和秒。 Quite often client applications will only display the year-month-day components but the time components are still always there (even if you aren't shown them).客户端应用程序通常只会显示年-月-日组件,但时间组件仍然始终存在(即使您没有显示它们)。

If you are storing a DATE with a time component then you need to match the entire time range for the day and can do this using:如果要存储带有时间组件的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)  

or或者

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)  

Try using TRUNC function,尝试使用 TRUNC 函数,

sample,样本,

TRUNC(RT.TR_DATE)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM