Sql 如何在oracle11g中比较两个日期

Sql 如何在oracle11g中比较两个日期,sql,database,oracle,oracle11g,Sql,Database,Oracle,Oracle11g,我是甲骨文的新手。我需要将日期列与oracle 11g中的当前日期进行比较 例如,我的桌子是 srno dob 1 1992-04-01 2 1988-04-01 3 1995-04-01 所以我必须用系统日期压缩dob。如果匹配,则必须显示数据 我已尝试此查询以获得结果 select dob from xyz where extract(month from dob)=extract(month from sysdate)

我是甲骨文的新手。我需要将日期列与oracle 11g中的当前日期进行比较

例如,我的桌子是

srno        dob
1       1992-04-01
2       1988-04-01  
3       1995-04-01  
所以我必须用系统日期压缩dob。如果匹配,则必须显示数据

我已尝试此查询以获得结果

select dob 
from xyz 
where extract(month from dob)=extract(month from sysdate) 
  and extract(day from dob)=extract(day from sysdate);
但它不起作用。请告诉我哪里出了问题

谢谢。

试试这个

select ...
where to_char(dob,'MMDD')=to_char(sysdate,'MMDD')
SELECT DOB
FROM XYZ 
WHERE TRUNC (DOB) = TRUNC (SYSDATE)

如上所述,如果需要进行转换,请使用to_char,并查看可用的不同格式掩码。如果dob数据类型是日期,则可以直接与SYSDATE值进行比较。如上所述,仅获取MMDD将仅将04月和01日作为字符字符串进行比较。

我刚刚尝试了您在问题中给出的示例,看不出使用extract有什么问题,如您所示:

select dob 
from xyz 
where extract(month from dob)=extract(month from sysdate) 
  and extract(day from dob)=extract(day from sysdate);
还是我误解了什么?你说代码不起作用,但我不明白你的意思

在这种情况下,我更喜欢使用extract而不是_char,因为我觉得它更清楚地代表了我想要的东西。我不需要日期的字符表示,我只想比较月份和日期


下面是一个SQLFIDLE示例:

您得到的错误是什么? 在数据库中,dob字段定义为日期还是varchar2

如果DB字段为varchar2,则可能需要使用

SELECT * FROM XYZ
WHERE TRUNC ( TO_DATE(DOB, 'YYYY-MM-DD') ) = TRUNC (SYSDATE);

在Oracle中比较两个日期有更简单的方法。请尝试以下解决方案:

select random_date_1, random_date_2,

-- when you have to match the complete date
/* use to_char(random_date_1,'Dd-Mon-Yy hh24.mi.ss') 
 when comparing date time */
/* use to_char(random_date_1,'Dd-Mon-Yy hh24')
 when only checking the date and hour (this is actually useful in a scenarios */

case when trunc(random_date_1) = trunc(random_date_2) 
then 'Match' else 'No Match' end as method_1,
case when to_char(random_date_1,'Dd-Mon-Yy') = to_char(random_date_2,'Dd-Mon-Yy') 
then 'Match' else 'No Match' end as method_2,

-- when you have to match only month
case when trunc(random_date_1,'Mon') = trunc(random_date_2,'Mon')
then 'Match' else 'No Match' end as method_3,
case when to_char(random_date_1,'Mon') = to_char(random_date_2,'Mon') 
then 'Match' else 'No Match' end as method_4

from
(select to_date(round (dbms_random.value (24, 31))
        || '-'
        || round (dbms_random.value (01, 01))
        || '-'
        || round (dbms_random.value (2015, 2015)),
        'DD-MM-YYYY') + level - 1 random_date_1, 
       to_date(round (dbms_random.value (27, 31))
        || '-'
        || round (dbms_random.value (01, 01))
        || '-'
        || round (dbms_random.value (2015, 2015)),
        'DD-MM-YYYY') + level - 1 random_date_2 from dual
connect by level <= 10);

为什么你认为它不起作用?它不起作用不是一个可接受的错误描述,你知道今天是4月1日,所以任何4月2日的DOB都不会显示。对不起……书写错误……现在我编辑了这个问题……除非这个人今天出生,否则日期不会匹配。Trunc只删除日期的时间元素,而不删除年份。