Oracle查询连接日期

时间:2013-07-26 09:51:50

标签: sql oracle

我有以下查询:

select * 
  from mytable 
 where to_char(mydate,'mm/dd/yyyy') between ('05/23/2013') 
                                        and ('06/22/2013')

我需要将其更改为动态制作,以便我不会每月从05/23/2013修改为06/23/2013,例如:

('05/23/' + (select to_char(sysdate, 'yyyy') from dual))

但这是错误的,有什么建议吗?

我需要做什么:每个月我都需要运行此查询以获取本月23日和上个月23日之间的记录

4 个答案:

答案 0 :(得分:4)

您正在对字符串进行比较,而不是在日期上进行比较,因此您的代码无法按照您的想法运行。

基于字符串逻辑,“05/23/2000”介于“05/22/2013”​​和“06/24/2000”之间。

将数据类型保持为日期,Oracle将获得正确的比较。

可能你想要的是:

select *
from   my_table
where  mydate >= add_months(trunc(sysdate,'MM'),-1)+22 and
       mydate <  trunc(sysdate,'MM')+22

但如果没有对实际要求的描述就很难说清楚。

答案 1 :(得分:3)

Oracle使用||作为concatenation operator

('05/23/' || (select to_char(sysdate, 'yyyy') from dual))
顺便说一句,大卫是对的。如果你真的想比较日期的字符串表示(但为什么?),请使用与日期相同的日期格式:

to_char(mydate,'yyyy/mm/dd')

答案 2 :(得分:0)

这个怎么样?

SELECT '(''05/23/'''||to_char(sysdate, 'yyyy')||'''' FROM DUAL

没有测试,因为我现在没有Oracle数据库,需要检查引用转义...

您是否需要从这个月起的确切日期?您还可以从sysdate中减去天数:

SELECT (sysdate - 30) FROM DUAL

答案 3 :(得分:0)

您也可以使用concat功能

concat('05/23/', (select to_char(sysdate, 'yyyy') from dual))