我有以下查询:
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日之间的记录
答案 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))