1

これらのパラメーターを指定して実行すると、次の sql、

:P_COMP_DATE_FROM = '2015 年 11 月 15 日' :P_COMP_DATE_TO = '2015 年 11 月 15 日'

「15-NOV-2015 00:00:00」と「15-NOV-2015 00:00:00」の間で比較

Select Ordered_date
From xxcost_rep
Where DATE_COMPLETED BETWEEN NVL(fnd_date.canonical_to_date(:P_COMP_DATE_FROM), DATE_COMPLETED) AND NVL(fnd_date.canonical_to_date(:P_COMP_DATE_TO)), DATE_COMPLETED);

これを 1 日の開始と 1 日の終了として比較するにはどうすればよいでしょうか。範囲内で正しい結果を表示できます。

次のようにして 86399 秒を追加して 1 日の終わりにしようとしていますが、エラーが発生します。

WHERE DATE_COMPLETED BETWEEN NVL(fnd_date.canonical_to_date(:P_COMP_DATE_FROM), DATE_COMPLETED) AND NVL(fnd_date.canonical_to_date(to_date(:P_COMP_DATE_TO,'DD-MON-YYYY')+interval '86399' second), DATE_COMPLETED)

{P_TO_CUSTOMER=、P_COMP_DATE_FROM=2015/11/15 00:00:00、P_COMP_DATE_TO=2015/11/15 00:00:00、P_TO_ORDER_NUMBER=、P_CUST_REGION=、P_TO_DATE=、P_JOB_STATUS=、P_FROM_DATE=、P_FROM_ORDER_NUMBER=、P_FROMBER= } Calling XDO Data Engine... --SQLException java.sql.SQLDataException: ORA-01861: リテラルがフォーマット文字列と一致しません

4

1 に答える 1

1

ORA-01861: リテラルがフォーマット文字列と一致しません

上記のエラーは、日付リテラルが書式マスクと一致しないために発生します。

例えば、

SQL> SELECT TO_DATE('2015118','yyyy/mm/dd') FROM dual;
SELECT TO_DATE('2015118','yyyy/mm/dd') FROM dual
               *
ERROR at line 1:
ORA-01861: literal does not match format string

日付を文字列として保存している可能性があり、異なる日付形式の文字列が存在する可能性があります。したがって、TO_DATEを使用してDATEfnd_date.canonical_to_dateに変換するときに、関数がそのような日付リテラルに対して失敗する可能性があります。

また、クライアントの NLS 日付形式に依存しないでください。TO_DATEは NLS に依存することに注意してください。format maskを明示的に言及する必要があります。

例えば、

SQL> SELECT  to_date('11/18/2015 00:00:00', 'mm/dd/yyyy hh24:mi:ss') date_from,
  2          to_date('11/18/2015 23:59:59', 'mm/dd/yyyy hh24:mi:ss') date_to
  3  FROM dual;

DATE_FROM           DATE_TO
------------------- -------------------
11/18/2015 00:00:00 11/18/2015 23:59:59

あなたの場合、日付を比較する必要があります。以下の例のようにできます。

SQL> WITH DATA AS(
  2  SELECT DATE '2015-11-18' dt FROM dual
  3  )
  4  SELECT * FROM DATA
  5  WHERE dt
  6  BETWEEN to_date(
  7                  to_char(dt, 'mm/dd/yyyy')||' 00:00:00',
  8                  'mm/dd/yyyy hh24:mi:ss'
  9                 )
 10  AND     to_date(
 11                  to_char(dt, 'mm/dd/yyyy')||' 23:59:59',
 12                  'mm/dd/yyyy hh24:mi:ss'
 13                 );

DT
-------------------
11/18/2015 00:00:00

アップデート

開始時刻だけが必要な最初の部分では00:00:00DATEには日付要素と時刻要素の両方があるため、時刻部分を追加する必要はありません。時間の部分について言及しない場合、デフォルトは真夜中になり00:00:00ます。

たとえば、INTERVAL '86399' SECONDを追加します。

SQL> SELECT DATE '2015-11-18' from_date,
  2         DATE '2015-11-18' + INTERVAL '86399' SECOND to_date
  3  FROM dual;

FROM_DATE           TO_DATE
------------------- -------------------
11/18/2015 00:00:00 11/18/2015 23:59:59
于 2015-11-18T08:50:11.160 に答える