Postgresql
用毫秒將 VARCHAR 轉換為 TIMESTAMP 會產生“錯誤:日期/時間欄位值超出範圍”
我有一個帶有值的 VARCHAR 列,
'2018-07-05T16:14:27.1427'
並使用以下命令將其轉換為時間戳: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
。它現在會產生一個錯誤。解釋你觀察到的。你需要清理你的輸入。
這是討論這些更改的執行緒。
Casting 似乎在 PostgreSQL 11.5 上執行良好
select '2018-07-05T16:14:27.1427', to_char(to_timestamp('2018-07-05T16:14:27.1427','yyyy-MM-dd HH24:mi:ss') - interval '2 hour','yyyy-MM-dd"T"HH24:mi:ss"Z"') as new_last_run