поиск соответствий между двумя датами - PullRequest
1 голос
/ 13 мая 2011

Я хочу найти все Patients.dob, которые находятся между Patient.dob - 20 и patient.dob -30 (в годах).

Я использую Oracle 10g, и попытался dateAdd и попытался заменить SYSTIME - 12*30, но ни один не работает.

Данные загружаются нормально и в формате даты, как и должно быть.

Как это можно сделать?

Ответы [ 2 ]

0 голосов
/ 13 мая 2011

Вы можете извлечь год и сделать интервал (но таким образом можно получить только разницу в году, точную разницу в 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 голосов
/ 13 мая 2011

Вы можете использовать add_months, чтобы сделать это:

select * from patient p 
  where 
    add_months(p.dob,30 * 12) > current_date and 
    add_months(p.dob,20 * 12) < current_date;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...