我现在有这样一个需求
人员表中有生日字段,为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,
这时候就出问题了,
请教怎么解决?
人员表中有生日字段,为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,
这时候就出问题了,
请教怎么解决?
解决方案 »
- ORACLE procedure 有参数长度 有什么办法能解决吗?
- oracle 存储过程 临时表for 循环 添加数据
- 新手求教oracle行转列问题
- 奇怪的oracle问题请教!!
- long raw ;如何在存储过程里 进行 insert?
- 那位有oracle Developer和PL/SQL Developer???????
- imp导入触发器问题!
- 小问题:AT END OF TABLE!!!
- ORACLE的pl/sql中获得错误信息?????
- 各位ORACLE前辈请指点很菜的一个问题 在线求救 有分100分 急!!!!!!1
- 请教点基础的自定义函数问题。麻烦了。。。
- 请高手帮忙详细说明一下 like 这个模糊查询 % 不同位置的解释。或者给一个比较明显的例子。谢谢
FROM PERSON_INFO
WHERE BIRTHDAY BETWEEN SYSDATE AND SYSDATE + 7;
FROM PERSON_INFO
WHERE TO_CHAR(SYSDATE,'YYYY')||TO_CHAR(BIRTHDAY, 'MMDD')
BETWEEN TO_CHAR(SYSDATE, 'YYYYMMDD') AND TO_CHAR(SYSDATE + 7, 'YYYYMMDD') 加上年一起比就行了
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-'
BETWEEN TO_CHAR(SYSDATE, 'yyyy/mm/dd') AND
TO_CHAR(SYSDATE + 7, 'yyyy/mm/dd')
where trunc(to_date(to_char(sysdate,'YYYY')||to_char(birthday,'MMDD'),'YYYYMMDD'))
between sysdate and sysdate+7;
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')
这种方法也不对。
比如今天是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) ) ;
还是有问题。
今天是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) ) ;
SELECT SYSDATE + 7 FROM DUAL
我这里怎么是6月6日
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)这样总没问题了..我汗呀,自己太粗心了.
建议这样写,让每个人都能年年过生日吧.to_char(birthday, 'mm-dd')
-> replace(to_char(birthday, 'mm-dd'),'02-29','02-28')
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
FROM PERSON_INFO
WHERE BIRTHDAY<=SYSDATE AND BIRTHDAY>=SYSDATE - 7
嘿嘿.
马上给分哈
SELECT to_char(rownum + SYSDATE - 1, 'mm-dd') rn
FROM dual
CONNECT BY rownum < 8不