即将到来的生日oracle plsql列表

时间:2012-12-05 11:45:46

标签: database oracle plsql date-arithmetic

我手上有问题。我正在开发一个应用程序,用户希望将愿望卡发送给其生日在用户提供的FROM和TO日期之内的客户,而不管年份如何。即搜索结果应仅基于月份和日期。例如我的输入参数是从日期:“12/05”(12月05日)和到日期:“01/04”(1月04日)。请帮忙。提前致谢

3 个答案:

答案 0 :(得分:1)

您可以使用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

答案 1 :(得分:0)

您应该使用此查询条件。如果它是从现在开始的一个月间隔,它会选择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') 


    )

)

答案 2 :(得分:0)

假设您已将DOB存储为DATE,请在表PPL中使用column =“DOB”。

即原始集:

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