oracle ORA-01847月份日期必须介于1和月份最后一天之间-但数据正常

vyu0f0g1  于 2023-01-20  发布在  Oracle
关注(0)|答案(3)|浏览(260)
  • 问题已解决-请参阅本帖末尾。*

当我在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;
332nm8kg

332nm8kg1#

以下是带有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;

相当难看,但它可能会解决你的问题。

rslzwgfq

rslzwgfq2#

如果您在SQL中使用OracleParameter,并绑定参数名称和值,请检查您设置的oracleCommand.BindByName = true,然后它将按名称绑定,而不是按参数添加顺序绑定。

xzlaal3s

xzlaal3s3#

我只想补充一点,当用户的Web浏览器语言编码从英语更改为葡萄牙语时,我们得到了相同的ORA-01847错误。
失败的代码行是:

IF TO_DATE(NEW_DATE,'DD-MON-YYYY') = TO_DATE(OLD_DATE,'DD-MON-YYYY') THEN

通过将其重写为以下内容进行了修复:

IF TO_CHAR(NEW_DATE,'DD-MON-YYYY') = TO_CHAR(OLD_DATE,'DD-MON-YYYY') THEN

Oracle似乎检测到语言更改,并假定日期值将针对葡萄牙语区域设置进行格式化。

相关问题