1. ホーム
  2. sql

[解決済み] ORA-01847 月曜日は1日から最終日の間でなければならない - しかし、データはOKです。

2022-03-12 11:39:55

質問

問題は解決しました。この記事の最後をご覧ください。

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

すべてのdatestringは期待通りに変換されました。

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;

解決方法は?

これは、あなたのクエリに 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;

かなり醜いですが、あなたの問題を解決してくれるかもしれません。