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中如何比较两个日期的主要内容,如果未能解决你的问题,请参考以下文章