Shi*_*ver 13 postgresql timestamp date-format bulk-load postgresql-copy
我正在尝试编写一个查询以将值插入到timestamp with no timezone data类型字段中.该值来自CSV文件.
我正在使用的版本是PostgreSQL 8.1.21.
CSV文件上载由客户端完成,它有一个日期列.日期有时是格式'28-Sep-13'而有时'28/09/2013'格式.
我尝试使用以下命令将字符串转换为时间戳:
str_date::timestamp.
如果能正常工作str_date是一样的东西'28-Sep-13',但如果输入日期的格式将无法正常工作'28/09/2013',就会出现此错误:
Run Code Online (Sandbox Code Playgroud)ERROR: date/time field value out of range: "28/09/2013" HINT: Perhaps you need a different "datestyle" setting
基本上,客户端不断更改上载的CSV文件中的日期格式.
有没有办法将日期字符串转换为时间戳取决于其实际格式?
Mat*_*ood 15
您需要将日期样式设置为"ISO,DMY".默认设置为"ISO,MDY",会导致您的示例失败:
> show datestyle;
DateStyle
-----------
ISO, MDY
(1 row)
> select '28-Sep-13'::date;
date
------------
2013-09-28
(1 row)
> select '28/09/2013'::date;
ERROR: date/time field value out of range: "28/09/2013"
LINE 1: select '28/09/2013'::date;
^
HINT: Perhaps you need a different "datestyle" setting.
> set datestyle = 'ISO, DMY';
SET
> select '28-Sep-13'::date;
date
------------
2013-09-28
(1 row)
> select '28/09/2013'::date;
date
------------
2013-09-28
(1 row)
Run Code Online (Sandbox Code Playgroud)
(在PostgreSQL 9.1中完成的示例,但DateStyle设置和相关行为是古老的,所以应该工作正常)
您可以通过以下步骤规避问题:
创建一个与目标表具有相同结构的空临时表:
CREATE TEMP TABLE tmp AS SELECT * FROM real_tbl LIMIT 0;
Run Code Online (Sandbox Code Playgroud)将有问题的列的类型更改为文本:
ALTER TABLE tmp ALTER COLUMN str_date TYPE text;
Run Code Online (Sandbox Code Playgroud)将数据导入临时表.现在应该工作正常:
COPY tmp FROM '/path/to/my/file.txt';
Run Code Online (Sandbox Code Playgroud)INSERT根据列的实际内容进入目标表:
INSERT INTO real_tbl (col1, col2, col3, date_col)
SELECT col1, col2, col3
, CASE WHEN str_date ~~ '%/%'
THEN to_date(str_date, 'DD/MM/YYYY')
WHEN str_date ~~ '%-%'
THEN to_date(str_date, 'DD-Mon-YYYY')
-- more cases?
ELSE ???
END AS date_col
FROM tmp;
-- DROP TABLE tmp; -- optional; dropped at end of session automatically
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
45086 次 |
| 最近记录: |