質問
SQLには次の節があります。これは、Oracleデータベースに対して実行されています。 sc_dt
フィールドは、DBで日付フィールドとして定義されています。
sc_dt = TO_DATE('2011-11-03 00:00:00.0', 'YYYY-MM-DD')
次のエラーが生成されます "date format picture ends before converting entire input string"
わずかな秒を説明しようとするとき(.0
この場合)次の場合、次のエラーが発生します。
sc_dt = TO_DATE('2011-11-03 00:00:00.0', 'YYYY-MM-DD HH24:MI:SS.FF')
次のエラーが生成されます "date format not recognized"
私は本当に必要だと思っています .FF
を説明する .0
「from」文字列。私も試しました .FF1
, .FF2
, ..., .FF9
同じ結果があります(この時点でわらを把握しています)。
私が見る限り、 sc_dt
フィールドには常に月/日/年の部分が人口がかかります(時間/秒/秒部分ではありません)。
上記のSQLを準備したステートメントとして実行しているJavaプログラムをデバッグしています 2011-11-03 00:00:00.0
価値。
どうすればこれを回避できますか?
解決
Midnight Midnight Optionを使用する必要があります。何かのようなもの:
select TO_DATE('2011-11-03 00:00:01.1', 'YYYY-MM-DD HH24:MI:SS.SSSSS') from dual
またはこれ:
select TO_TIMESTAMP('2011-11-03 00:00:00.1', 'YYYY-MM-DD HH24:MI:SS.FF') from dual
他のヒント
オラクル DATE
のような列 sc_dt
常に2番目の1日と時間コンポーネントがあります。クエリツールとその構成方法に応じて(通常、セッションの構成 NLS_DATE_FORMAT
)、時間コンポーネントがデフォルトで表示されていない可能性があります。ただし、明示的なことを行うことで、時間コンポーネントを確認できます TO_CHAR
SELECT to_char( sc_dt, 'YYYY-MM-DD HH24:MI:SS' )
FROM table_name
a DATE
時間のみを2番目に保存しますが、フォーマットマスクで分数秒を使用することはできません。したがって、文字列の部分のみを分数秒まで抽出するには、このようなことをする必要があります。文字列が小数点以下で常に19文字になることを保証しない場合、使用できます INSTR
小数点を探して、その前にすべてを取ることもできます。
TO_DATE( substr('2011-11-03 00:00:00.0', 1, 19), 'YYYY-MM-DD HH24:MI:SS')
ただし、これはJavaアプリケーションからのものであるため、正しいデータ型を使用する方がはるかに優れています。 java日付(java.sql.date)を使用してバインドする場合 setDate
文字列をバインドするのではなく、作成したステートメントのメソッドでは、SQLステートメントの文字列形式を処理する必要はありません。
私はこのスレッドが1年以上前のものであることを理解していますが、それを投げるためだけに別のオプションは次のとおりです。
src_dt=select TO_DATE('2011-11-03 00:00:01.1234', 'YYYY-MM-DD HH24:MI:SS.?????') from dual;
注:余分な「?」がありますいくつかの余分な「?」 「?」で表される数字に、ソースタイム文字列に対応する文字がない場合、Oracleからの苦情はありません。これは、受け取っている秒の精度がわからない場合に役立つ可能性があります。
このオプションは、ソース時間の「分数秒」の形式にある程度の柔軟性を与えます。これが実際にどこでも文書化されていることはわかりません。
これは私がしました :
ALTER SESSION
SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS.?';
--Change the decimal
ALTER SESSION
SET NLS_NUMERIC_CHARACTERS = ',.';
そしてそれは私のために働いた
src_dt =select TO_DATE('2011-11-03 00:00:01.1', 'YYYY-MM-DD HH24:MI:SS.SSSSS') from dual
日付出力が必要な場合は、上記のものが機能するはずだと思います。