2011-05-13 138 views
1

我想查找Patient.dob - 20patient.dob -30(以年为单位)之间的所有Patients.dob查找匹配2个日期操作之间的匹配

我使用的是Oracle 10g,并试图使用dateAdd,并试图用SYSTIME - 12*30代替,但两者都不起作用。

数据加载正常,并且应该是日期格式。

这怎么办?

回答

0

您可以提取年份和做之间的(但这种方式只得到一年的差别,没有必要确切的20-30岁差)

with datam as 
(
select level id, sysdate - level dob 
    from dual 
connect by level < 15000) 

select count(id) count_id , extract(year from dob) 
    from datam 
    where extract(year from dob) between 2011-30 and 2011-20 
    group by extract(year from dob) 
    order by 2 desc 

但是,忽略闰年(这是你试图用12 * 30的事,它应该是365 * 12)

with datam as 
(
select level id, sysdate - level dob 
    from dual 
connect by level < 15000) 

select count(id) count_id , extract(year from dob) 
    from datam 
    where dob between (sysdate - 365*30) and (sysdate - 365*20) 
    group by extract(year from dob) 
    order by 2 desc ; 

但是@ Briguy37也可以工作:

with datam as 
(
select level id, sysdate - level dob 
    from dual 
connect by level < 15000) 

select count(id) count_id , extract(year from dob) 
    from datam 
    where dob between add_months(dob,- 12*30) and add_months(sysdate,- 12*20) 
    group by extract(year from dob) 
    order by 2 desc ; 
+0

真棒谢谢很多人 – idkWATimDOIN 2011-05-13 22:22:10

+0

是否有任何理由为什么此代码: WHERE add_months(“Patients”。“Patient_DOB”,-30 * 12)<=“Patients”。“Patient_DOB”AND add_months(“Patients”。“Patient_DOB “,-20 * 12)> =”患者“。”Patient_DOB“; 返回没有找到数据?并有价值目前,shud被退回 – idkWATimDOIN 2011-05-13 22:44:48

+0

nvm我得到了它对不起,长了一天大声笑 – idkWATimDOIN 2011-05-13 22:50:40

0

您可以使用ADD_MONTHS做到这一点:

select * from patient p 
    where 
    add_months(p.dob,30 * 12) > current_date and 
    add_months(p.dob,20 * 12) < current_date; 
+0

注意:它不能直接进行相减的原因是因为该计算以天计算。 – Briguy37 2011-05-13 18:54:20

+0

难道你不想要常量的负值吗?例如,add_months(p.dob,-20 * 12) – DCookie 2011-05-13 20:52:21

+0

@DCookie如果你举出一个在01/01/1990出生的人的例子,他们目前是21岁,因此这个陈述对他们来说应该是真实的。分别增加20和30年会给你01/01/2010和01/01/2020,而2011年5月13日的当前日期是在这些日期之间,所以它是成立的。如果您正在执行当前日期的操作,则需要减去此值,例如idkWATimDOIN正在处理该问题。 – Briguy37 2011-05-13 21:46:52