値'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.1427
は2018-07-05T16:14:28.427
です。
この動作が新しいバージョンで正常であるかどうかはわかりません。処理する必要がありますか、それともバグですか。
Postgres 10では、date
およびtimestamp
入力の処理がより厳密になりました リリースノートの引用:
to_timestamp()
およびto_date()
が範囲外の入力フィールドを拒否するようにしました(Artur Zakirov)たとえば、以前は
to_date('2009-06-40','YYYY-MM-DD')
が受け入れられ、2009-07-10
が返されました。エラーが発生します。
観察したことを説明します。入力を無害化する必要があります。
これが これらの変更が議論されたスレッド です。