问题已解决 - 请参阅此帖的结尾。
当我在select子句中调用to_date时,一切正常 - 得到12个记录的结果集:
select value1,to_date(value1,'DD.MM.YYYY')
from variableindex
where
value1 is not null
and value1 <> '0'
and creation_time_ > to_timestamp('20140307','YYYYMMDD')
order by 2
返回
'VALUE1' 'TO_DATE(VALUE1,'DD.MM.YYYY')'
'25.11.2013' 25.11.13
'12.03.2014' 12.03.14
'12.03.2014' 12.03.14
'12.03.2014' 12.03.14
'12.03.2014' 12.03.14
'12.03.2014' 12.03.14
'14.03.2014' 14.03.14
'14.03.2014' 14.03.14
'14.03.2014' 14.03.14
'14.03.2014' 14.03.14
'20.03.2014' 20.03.14
'20.03.2014' 20.03.14
每个日期字符串都已按预期转换。
如果我将以下行添加到where子句
and to_date(value1,'DD.MM.YYYY') < to_date('20140301','YYYYMMDD')
我会收到:
ORA-01847: Tag des Monats muss zwischen 1 und letztem Tag des Monats liegen
01847. 00000 - "day of month must be between 1 and last day of month"
*Cause:
*Action:
不,它真的变得讨厌......我把查询改为
where id_ in (...)
并使用与原始查询中相同的12个记录集ID。没错误......
非常感谢@GordonLinoff - 这就是我现在使用查询的方式:
select value1,to_date(value1,'DD.MM.YYYY') from variableindex
where
(case when value1 <> '0' then to_date(value1,'DD.MM.YYYY') end) > to_timestamp('20131114','YYYYMMDD')
and creation_time_ > to_timestamp('20140307','YYYYMMDD')
order by 2;
答案 0 :(得分:4)
这是您使用where
子句的查询:
select value1, to_date(value1,'DD.MM.YYYY')
from variableindex
where value1 is not null and
value1 <> '0' and
creation_time_ > to_timestamp('20140307', 'YYYYMMDD') and
to_date(value1 'DD.MM.YYYY') < to_date('20140301', 'YYYYMMDD')
order by 2;
Oracle不保证where
中处理子句的顺序。因此,value <> '0'
无法保证在最后一个条件之前运行。这恰好是SQL Server上的一个大问题。一种解决方案是使用case
语句:
select value1,to_date(value1, 'DD.MM.YYYY')
from variableindex
where value1 is not null and
value1 <> '0' and
creation_time_ > to_timestamp('20140307', 'YYYYMMDD') and
(case when value <> '0' then to_date(value1, 'DD.MM.YYYY') end) <
to_date('20140301', 'YYYYMMDD')
order by 2;
相当丑陋,但它可能会解决你的问题。
答案 1 :(得分:0)
如果您在SQL中使用OracleParameter
进行参数名称和值绑定,请检查您是否设置了oracleCommand.BindByName = true
,然后它将按名称而不是按参数添加顺序进行绑定。