如何比较oracle11g中的两个日期

时间:2014-04-01 08:18:48

标签: sql database oracle oracle11g

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

我的表是一个例子

srno        dob
1       1992-04-01
2       1988-04-01  
3       1995-04-01  

所以我必须使用sysdate来复制dob。如果匹配则必须显示数据。

我已经尝试过这个查询来获得结果。

select dob 
from xyz 
where extract(month from dob)=extract(month from sysdate) 
  and extract(day from dob)=extract(day from sysdate);

但它不起作用。请告诉我哪里出错了。

感谢。

6 个答案:

答案 0 :(得分:1)

select ...
where to_char(dob,'MMDD')=to_char(sysdate,'MMDD')

答案 1 :(得分:0)

试试这个

SELECT DOB
FROM XYZ 
WHERE TRUNC (DOB) = TRUNC (SYSDATE)

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我刚刚尝试了您在问题中提供的示例,并且无法看到使用extract时出现的问题,如您所示:

select dob 
from xyz 
where extract(month from dob)=extract(month from sysdate) 
  and extract(day from dob)=extract(day from sysdate);

还是我误解了什么?你说代码不起作用但是我看不出你的意思。

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

这是一个带有示例的SQLFiddle:http://sqlfiddle.com/#!4/c545c/2

答案 4 :(得分:0)

你得到的错误是什么? 在您的DB中,dob字段定义为DATE或varchar2?

如果您的数据库字段是varchar2,那么您可能必须使用

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

答案 5 :(得分:0)

有更简单的方法来比较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);