2015-09-25 38 views
1

嘗試更新列與varchar數據類型例如'1950年8月14日' 到使用更新vachar列在日期postgreSQL

UPDATE tablename SET columnname = to_date(columnname, 'YYYY-MM-DD'); 

ALTER TABLE tablename ALTER COLUMN columnname TYPE DATE USING to_date(columnname, 'YYYY-MM-DD'); 

一個date數據類型但兩者返回錯誤消息

ERROR: invalid value "columnname" for "YYYY" 
DETAIL: Value must be an integer. 

引用http://www.postgresql.org/docs/9.4/static/functions-formatting.html

+0

你確定你不是引用列名?你能顯示你正在運行的實際查詢嗎? – Schwern

+0

爲'columnname'的第一個實例我試過使用相同的列,即正在更改to_date(),也是一個新的空列類型'日期' – acmyers

回答

2

查詢:

ALTER TABLE tablename 
    ALTER COLUMN columnname TYPE DATE USING to_date(columnname, 'YYYY-MM-DD'); 

是正確的。

錯誤消息意味着您在列columnname(實際上無效值是'columnname')具有無效值。 列中的所有值都必須具有格式「YYYY-MM-DD」,例如'2015-01-01'(或爲空)。


帶有新列的解決方案。

創建一個函數來varchar轉換爲date這爲無效值返回null

create or replace function varchar_to_date_or_null(str varchar) 
returns date language plpgsql as $$ 
begin 
    return to_date(str, 'YYYY-MM-DD'); 
exception 
    when invalid_datetime_format then return null; 
end $$; 

添加一個新的列和使用功能更新:

alter table tablename add new_column date; 

update tablename 
set new_column = varchar_to_date_or_null(columnname); 
+0

任何想法如何繞過這個?我有一個45,000行的表格,其中有一列文本數據類型的日期。我看過的所有人似乎都遵循格式'YYYY-MM-DD'......也許有些人錯誤地輸入了錯誤的內容?我應該刪除不適合該格式的字符串嗎? – acmyers

+0

不錯,謝謝!方便地,我一直在嘗試更好地處理'創建或替換功能'。 – acmyers