我现在有这样一个需求 
人员表中有生日字段,为date类型, 
现在要查出生日在7天内的人员. 
比如今天是2008-05-29 , 
那么就查出生日在5-29和6-5日之间的人员, 
sql语句应该怎么写? 
SQL codeSELECT * 
  FROM PERSON_INFO 
WHERE TO_CHAR(BIRTHDAY, 'MM-DD') BETWEEN TO_CHAR(SYSDATE, 'MM-DD') AND 
      TO_CHAR(SYSDATE + 7, 'MM-DD') 
这个语句可以解决一部分生日的比较,
可是当跨年的时候此语句就会出问题。
比如现在是2008-12-29日,生日是1989-01-01,
这时候就出问题了,
请教怎么解决?

解决方案 »

  1.   

    SELECT * 
      FROM PERSON_INFO 
    WHERE BIRTHDAY BETWEEN SYSDATE AND SYSDATE + 7;
      

  2.   

    SELECT * 
      FROM PERSON_INFO 
     WHERE TO_CHAR(SYSDATE,'YYYY')||TO_CHAR(BIRTHDAY, 'MMDD') 
           BETWEEN TO_CHAR(SYSDATE, 'YYYYMMDD') AND TO_CHAR(SYSDATE + 7, 'YYYYMMDD') 加上年一起比就行了
      

  3.   

    where to_date(BIRTHDAY) between SYSDATE-7 and  SYSDATE+7
      

  4.   

    跨年应该没有问题啊TO_CHAR(SYSDATE + 7, 'MM-DD') ->是系统时间+7天,只是针对2月29号会有问题
      

  5.   

    SELECT * 
      FROM PERSON_INFO
     WHERE REPLACE(TO_CHAR(BIRTHDAY, 'MM-DD'),'01-','13-') 
           BETWEEN REPLACE(TO_CHAR(to_date('20081011','yyyymmdd'), 'MM-DD','01-','13-') AND 
                   REPLACE(TO_CHAR(to_date('20081011','yyyymmdd') + 7, 'MM-DD'),'01-','13-')
    没多细想,用了个笨方法,改一点点你原来的程序就可以,把'01-'换成'13-'
      

  6.   

    WHERE to_char(sysdate,'yyyy/')||to_char(to_date(BIRTHDAY),'mm/dd')
     BETWEEN TO_CHAR(SYSDATE, 'yyyy/mm/dd') AND 
          TO_CHAR(SYSDATE + 7, 'yyyy/mm/dd') 
      

  7.   

    select   *   from   emp   
          where trunc(to_date(to_char(sysdate,'YYYY')||to_char(birthday,'MMDD'),'YYYYMMDD'))
    between sysdate and sysdate+7;
      

  8.   

    WHERE to_char(sysdate,'yyyy/') ¦ ¦to_char(to_date(BIRTHDAY),'mm/dd') 
    BETWEEN TO_CHAR(SYSDATE, 'yyyy/mm/dd') AND 
          TO_CHAR(SYSDATE + 7, 'yyyy/mm/dd') 
    or 
    to_char(add_months(sysdate,12),'yyyy/') ¦ ¦to_char(to_date(BIRTHDAY),'mm/dd') 
    BETWEEN TO_CHAR(SYSDATE, 'yyyy/mm/dd') AND 
          TO_CHAR(SYSDATE + 7, 'yyyy/mm/dd') 
      

  9.   

    爱猫猫的鱼:
    这种方法也不对。
    比如今天是1-30号,生日是2-1号的呢?
    不能这样替换。我写了一个语句就是比较麻烦,想看看大家还有没有更好的方法:
    SELECT *
      FROM PERSON_INFO
     WHERE  birthday is not null and (TO_date(to_char(sysdate, 'YYYY')||to_char(birthday,'MM-DD'),'YYYY-MM-DD')  BETWEEN trunc(SYSDATE) AND
           trunc(SYSDATE + 7) 
           or 
           TO_date(to_char(sysdate+1, 'YYYY')+1||to_char(birthday,'MM-DD'),'YYYY-MM-DD')  BETWEEN trunc(SYSDATE) AND
           trunc(SYSDATE + 7) )  ;
      

  10.   

    我的回复怎么显示不出来。再回一遍:爱猫猫的鱼:
    还是有问题。
    今天是1-30,生日是2-1的就查不出来了。
    不能简单的替换。
    我写了一个,有点复杂,看各位还有没有更好的解决办法:
    SELECT *
      FROM PERSON_INFO
     WHERE  birthday is not null and (TO_date(to_char(sysdate, 'YYYY')||to_char(birthday,'MM-DD'),'YYYY-MM-DD')  BETWEEN trunc(SYSDATE) AND
           trunc(SYSDATE + 7) 
           or 
           TO_date(to_char(sysdate+1, 'YYYY')+1||to_char(birthday,'MM-DD'),'YYYY-MM-DD')  BETWEEN trunc(SYSDATE) AND
           trunc(SYSDATE + 7) )  ;
      

  11.   

    照楼主说家数不能进月和年?
    SELECT SYSDATE + 7 FROM DUAL
    我这里怎么是6月6日
      

  12.   

    mod(sysdate-to_date(birthday ),365)<=7
      

  13.   

    SELECT *
      FROM person_info
     WHERE to_char(birthday, 'mm-dd') IN
           (SELECT to_char(rownum + SYSDATE - 1, 'mm-dd') rn
              FROM dual
            CONNECT BY rownum < 8)这样总没问题了..我汗呀,自己太粗心了.
      

  14.   

    不过这样写,那些2月29号生日的朋友就真的只能4年过一次生日了...
    建议这样写,让每个人都能年年过生日吧.to_char(birthday, 'mm-dd') 
    -> replace(to_char(birthday, 'mm-dd'),'02-29','02-28')
      

  15.   

    select  *  from  emp  
    where trunc(to_date(to_char(sysdate,'YYYY') ¦ ¦to_char(birthday,'MMDD'),'YYYYMMDD')) 
    between sysdate and sysdate+7 
    or trunc(to_date(to_char(sysdate,'YYYY') ¦ ¦to_char(birthday,'MMDD'),'YYYYMMDD'))+interval '1' year
    between sysdate and sysdate+7      
      

  16.   

    还是同意between sysdate and sysdate+7
      

  17.   

    SELECT * 
      FROM PERSON_INFO 
    WHERE BIRTHDAY<=SYSDATE AND BIRTHDAY>=SYSDATE - 7
      

  18.   

    EXTRACT(c,FROM d)查下这个函数吧。返回日期时间d中指定的部分
      

  19.   

    爱猫猫的鱼.多谢了.牛xxxx!
    嘿嘿.
    马上给分哈
      

  20.   

    EXTRACT(c,FROM d)查下这个函数吧。返回日期时间d中指定的部分 指定的部分上下加减七天 
      

  21.   

    猫猫能给解释一下
    SELECT to_char(rownum + SYSDATE - 1, 'mm-dd') rn
              FROM dual
            CONNECT BY rownum < 8不