1

我有以下查询:

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

我需要将其更改为动态制作,这样我就不会每个月都修改它05/23/201306/23/2013例如:

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

但这是一个错误。有什么建议么?

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

4

4 回答 4

4

Oracle||用作连接运算符

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

顺便说一句,大卫是对的。如果您真的想比较日期的字符串表示形式(但为什么?),请使用与日期相同的日期格式:

to_char(mydate,'yyyy/mm/dd')
于 2013-07-26T09:53:52.740 回答
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

但是如果不描述实际需求是什么就很难说清楚。

于 2013-07-26T09:56:13.963 回答
0

这个怎么样?

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

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

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

SELECT (sysdate - 30) FROM DUAL
于 2013-07-26T09:57:21.127 回答
0

您也可以使用 concat 函数

concat('05/23/', (select to_char(sysdate, 'yyyy') from dual))
于 2013-07-26T09:57:33.657 回答