oracle11g中如何比较两个日期

Posted

技术标签:

【中文标题】oracle11g中如何比较两个日期【英文标题】:How to compare two dates in oracle11g 【发布时间】:2014-04-01 08:18:47 【问题描述】:

我是甲骨文的新手。我需要将日期列与 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);

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

谢谢。

【问题讨论】:

为什么你认为它不起作用? "it is not working" 不是可接受的错误描述(您确实意识到今天是 4 月 1 日,因此任何 4 月 2 日的 DOB 将不 显示出来。 对不起...写错了...现在我已经编辑了问题.. 【参考方案1】:
select ...
where to_char(dob,'MMDD')=to_char(sysdate,'MMDD')

【讨论】:

【参考方案2】:

在 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);

【讨论】:

【参考方案3】:

试试这个

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

【讨论】:

除非此人今天出生,否则日期将不匹配。 Trunc 只删除日期的时间元素,而不是年份。【参考方案4】:

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

【讨论】:

【参考方案5】:

我刚刚试用了您在问题中给出的示例,但看不出使用 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

【讨论】:

【参考方案6】:

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

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

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

【讨论】:

以上是关于oracle11g中如何比较两个日期的主要内容,如果未能解决你的问题,请参考以下文章

连接远程数据库ORACLE11g,错误百出!

Linux下如何安装安装oracle 11g

有没有更好的方法来编写这个处理比较两个不同列中的日期的 Oracle SQL?

Windows系统安装Oracle 11g 数据库

windows 连接64位oracle 11g

通过高级 SQL 过滤器进行 OBIEE11g 日期操作/比较