web-dev-qa-db-ja.com

VARCHARをミリ秒のTIMESTAMPに変換すると、「エラー:日付/時刻フィールドの値が範囲外です」

'2018-07-05T16:14:27.1427'のVARCHAR列があり、次のコマンドでタイムスタンプに変換します。

select last_run, 
       to_char(to_timestamp(last_run,'yyyy-MM-dd HH24:mi:ss') - interval '2 hour','yyyy-MM-dd"T"HH24:mi:ss"Z"') as new_last_run 
from schedule_tasks;

PostgreSQLのバージョン9.6.10までは、すべて正常に動作しましたが、10.5に移行すると、同じコマンドでERRORが返されます。同じ問題がPostgreSQL 11でも発生します。

私が理解しているのは、9.6では、4桁の場合の最初のミリ秒の値が秒に追加されることです。たとえば、変換された2018-07-05T16:14:27.14272018-07-05T16:14:28.427です。

この動作が新しいバージョンで正常であるかどうかはわかりません。処理する必要がありますか、それともバグですか。

1
Cleiton Domazak

Postgres 10では、dateおよびtimestamp入力の処理がより厳密になりました リリースノートの引用:

to_timestamp() およびto_date()が範囲外の入力フィールドを拒否するようにしました(Artur Zakirov)

たとえば、以前はto_date('2009-06-40','YYYY-MM-DD')が受け入れられ、2009-07-10が返されました。エラーが発生します。

観察したことを説明します。入力を無害化する必要があります。

これが これらの変更が議論されたスレッド です。

2