список предстоящих дней рождения оракула plsql

У меня проблема на руке. Я работаю над приложением, в котором пользователь хочет отправить карты желаний своим клиентам, чей день рождения находится в пределах предоставленных пользователем дат FROM и TO, независимо от года. т.е. результаты поиска должны основываться только на месяце и дате. например, мои входные параметры указаны с даты: «12/05» (05 декабря) и до даты: «01/04» (04 января). Пожалуйста помоги. заранее спасибо


person bilal    schedule 05.12.2012    source источник


Ответы (3)


Вы должны использовать это условие запроса. Он выбирает birthdate, если он находится в интервале в один месяц с этого момента. Дата рождения может быть из любого года:

where
TO_DATE(TO_CHAR(birthdate,'dd.mm')||'.1900','DD.MM.YYYY') ,
between
TO_DATE(TO_CHAR(sysdate,'dd.mm')||'.1900','DD.MM.YYYY') 
and ADD_MONTHS(TO_DATE(TO_CHAR(sysdate,'dd.mm')||'.1900','DD.MM.YYYY'),1) 

Если пользователь вводит диапазон дат, например, «02/03» и «23/06» («P1» и «P2» в этом запросе), используйте следующее условие.

where
(
TO_DATE(TO_CHAR(birthdate,'dd.mm')||'.1900','DD.MM.YYYY') ,
between
TO_DATE('P1'||'.1900','DD.MM.YYYY') 
and
TO_DATE('P2'||'.1900','DD.MM.YYYY') 
)

OR
(
    (TO_DATE('P1'||'.1900','DD.MM.YYYY') 
        > TO_DATE('P2'||'.1900','DD.MM.YYYY') )
    and 

    (
     TO_DATE(TO_CHAR(birthdate,'dd.mm')||'.1900','DD.MM.YYYY') ,
     between
     TO_DATE('P1'||'.1900','DD.MM.YYYY') 
     and
     TO_DATE('31.12.1900','DD.MM.YYYY') 
     OR
     TO_DATE(TO_CHAR(birthdate,'dd.mm')||'.1901','DD.MM.YYYY') ,
     between
     TO_DATE('01.01.1901','DD.MM.YYYY') 
     and
     TO_DATE('P2'||'.1901','DD.MM.YYYY') 


    )

)
person valex    schedule 05.12.2012
comment
Валекс спасибо за ваше время. На самом деле проблема в том, что это диапазон дат ввода пользователем. и пользователь может ввести любые критерии для двух дат в формате ММ/ДД - person bilal; 05.12.2012
comment
Спасибо за обновленный запрос, и после использования этого запроса моя проблема почти решена, за исключением одного сценария. Теперь проблема заключается в том, что если пользователь вводит дату TO меньше даты FROM, приложение возвращает неверный результат. например, если пользователь вводит критерии ОТ даты: 12/04 и ДО даты: 01/03 (т. е. он хочет увидеть результаты с 4 декабря по 03 января), в этом случае запрос не возвращает правильный результат - person bilal; 05.12.2012
comment
Добро пожаловать в Stack Overflow. Если этот ответ вам помог, отметьте его как принятый - person valex; 06.12.2012

Вы можете использовать функцию извлечения PLSQL:

extract(MONTH FROM DATE '2003-08-22') would return 8
extract(DAY FROM DATE '2003-08-22') would return 22

http://www.techonthenet.com/oracle/functions/extract.php

person Thunder-KC Inc    schedule 05.12.2012

предполагая, что вы сохранили DOB как DATE, скажем, столбец = «DOB» в таблице PPL.

то есть для необработанного набора:

FIRSTNAME                        LASTNAME                         DOB
-------------------------------- -------------------------------- ---------
Joe                              Bloggs                           03-JAN-90
Jane                             Doe                              05-JAN-40
Adam                             West                             05-DEC-76

мы получаем

SQL> select firstname, lastname,  dob, next_bday
 2    from (select firstname, lastname, dob,
 3                  case when to_date(to_char(dob, 'mmdd'), 'mmdd') < trunc(sysdate)
 4                    then add_months(to_date(to_char(dob, 'mmdd'), 'mmdd'), 12)
 5                    else to_date(to_char(dob, 'mmdd'), 'mmdd')
 6                  end next_bday
 7            from ppl)
 8   where next_bday < add_months(trunc(sysdate), 1);

FIRS LASTNA DOB       NEXT_BDAY
---- ------ --------- ---------
Joe  Bloggs 03-JAN-90 03-JAN-13
Adam West   05-DEC-76 05-DEC-12
person DazzaL    schedule 05.12.2012