0

1 つの列内に 2 つの形式の日付を含めることが可能かどうかを知りたいです。

問題は、テーブルが日付であるNULLの場合はデフォルト値が必要であり、テーブルがNULLでない場合はタイムスタンプだけが必要になることです。

これを行う必要がある CASE を作成しましたが、機能しません。

CASE WHEN s.time IS null 
THEN 
  TO_DATE('01-JAN-1901 01:00:00', 'dd-MON-yyyy HH24:MI:SS') 
ELSE
  TO_DATE(s.time, 'HH24:MI:SS') 
END AS time

そのステートメントは、「ORA-01858: 数値が必要な場所に数値以外の文字が見つかりました。

私がこのようなことをしようとすると:

CASE WHEN s.time IS null 
THEN 
  TO_DATE('01-JAN-1901 01:00:00', 'dd-MON-yyyy HH24:MI:SS') 
ELSE 
  TO_DATE(TO_CHAR(s.time, 'HH24:MI:SS'), 'HH24:MI:SS') 
END AS time

それは機能しますが、時刻の前に日付が追加されます - そして、次のようになります:

 TIME
-------
01-JAN-1901 01:00:00
01-JUL-2013 15:35:00

これの代わりに:

 TIME
-------
01-JAN-1901 01:00:00
15:35:00

(これは私が欲しいものです)

4

2 に答える 2

1

TO_CHAR()表示専用なので、代わりにを使用する必要がありTO_DATE()ますELSEが、両方のブランチで文字列を生成する必要があります。

CASE WHEN s.time IS null 
THEN 
  TO_CHAR(TO_DATE('01-JAN-1901 01:00:00', 'dd-MON-yyyy HH24:MI:SS')) 
ELSE
  TO_CHAR(s.time, 'HH24:MI:SS') 
END AS time

TO_CHAR(TO_DATE())に依存しない限り、 は冗長なNLS_DATE_FORMATので、これはより簡単です。

CASE WHEN s.time IS null 
THEN 
  '01-JAN-1901 01:00:00'
ELSE
  TO_CHAR(s.time, 'HH24:MI:SS') 
END AS time

両方のアプローチのSQL Fiddle 。


に を渡しているため、初期バージョンから ORA-01858 を取得しDATEますTO_DATE()。それは文字列引数を期待しており、これは暗黙の変換を引き起こしているので、あなたは本当にやっています:

TO_DATE(TO_CHAR(s.time), 'HH24:MI:SS')

NLS_DATE_FORMATあなたの設定のように見えるものに基づいています:

TO_DATE(TO_CHAR(s.time, 'DD-MON-YYYY HH24:MI:SS'), 'HH24:MI:SS')

したがって、次のようなことをしようとすることになります。

TO_DATE('16-JUL-2013 15:35:00', 'HH24:MI:SS')

指定した書式マスクJULの一部の分値の数値として (または実際のデータが持つ月)を解釈しようとするため、エラーが発生します。MI

于 2013-07-17T10:01:30.883 に答える