繁体   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