Postgresql

用毫秒將 VARCHAR 轉換為 TIMESTAMP 會產生“錯誤:日期/時間欄位值超出範圍”

  • October 10, 2019

我有一個帶有值的 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 中,處理datetimestamp輸入變得更加嚴格。引用發行說明:

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 

引用自:https://dba.stackexchange.com/questions/219623