我是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);
但它不起作用。请告诉我哪里出错了。
感谢。
答案 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);