oracle 如何比较只有日期而没有时间的两列

oxalkeyp  于 2023-04-20  发布在  Oracle
关注(0)|答案(2)|浏览(135)

表名为:机场
| 到达|出发|
| --------------|--------------|
| 01-04-22 12:00:00|01-04-22 12:00:00|
| 01-04-22 12:00:00|01-04-22 12:00:00|
| 01-04-22 12:00:00|01-04-22 16:00:00|
如果我尝试比较使用:

select * from airport where arriving= departure

结果:
| 到达|出发|
| --------------|--------------|
| 01-04-22 12:00:00|01-04-22 12:00:00|
| 01-04-22 12:00:00|01-04-22 12:00:00|
所以我想所有三行作为我的结果,我想比较只是日期而不是时间。
任何人都可以在简单的查询解释这一点。

umuewwlo

umuewwlo1#

Oralce中的DATE数据类型是一个误称。它实际上是一个datetime,由日期部分和时间部分组成。为了只比较日期部分,用TRUNC将datetime截断为午夜:

select *
from airport
where trunc(arriving) = trunc(departure);
fquxozlt

fquxozlt2#

Oracle DATE由7个字节组成(世纪,年,月,天,小时,分钟,秒)来比较它的日期部分,你应该去掉时间部分。它可以用不同的方式来完成。你可以使用其中任何一种最适合你的方式。下面是示例数据,SQL Select命令与三个不同的Where子句都给出了相同的结果。

WITH        --  Sample data
    tbl (ID, ARRIVING, DEPARTURE) AS
        (
            Select 1, To_Date('01-04-22 12:00:00', 'dd.mm.yy hh24:mi:ss'), To_Date('01-04-22 12:00:00', 'dd.mm.yy hh24:mi:ss') From Dual Union All
            Select 2, To_Date('01-04-22 12:00:00', 'dd.mm.yy hh24:mi:ss'), To_Date('01-04-22 12:00:00', 'dd.mm.yy hh24:mi:ss') From Dual Union All
            Select 3, To_Date('01-04-22 12:00:00', 'dd.mm.yy hh24:mi:ss'), To_Date('01-04-22 16:00:00', 'dd.mm.yy hh24:mi:ss') From Dual 
        )
--
--  SQL 
Select      ID, ARRIVING, DEPARTURE
From        tbl
Where       TRUNC(ARRIVING, 'dd') = TRUNC(DEPARTURE, 'dd')    -- truncate to the day
--  or
Where       To_Char(ARRIVING, 'dd.mm.yyyy') = To_Char(DEPARTURE, 'dd.mm.yyyy')    -- convert date part to char
--  or
Where       To_Number(To_Char(ARRIVING, 'yyyymmdd')) = To_Number(To_Char(DEPARTURE, 'yyyymmdd'))    --  convert date part to number

--  R e s u l t :
        ID ARRIVING  DEPARTURE
---------- --------- ---------
         1 01-APR-22 01-APR-22
         2 01-APR-22 01-APR-22
         3 01-APR-22 01-APR-22

相关问题