2011-05-13 186 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