看来您可以:
SET DATESTYLE = 'YMD';
SELECT
在从表中 ing之前。但是,这将影响所有日期的解释,而不仅仅是文件中的那些。如果您在其他地方始终使用明确的 ISO 日期,那会很好,但如果(例如)您还需要在同一查询中接受“D/M/Y”日期文字,则可能会出现问题。
这是特定于 GreenPlum 的CREATE EXTERNAL TABLE
,不适用于 SQL 标准的SQL/MED
外部数据包装器,如下所示。
令我惊讶的是,PostgreSQL 本身(没有此CREATE EXTERNAL TABLE
功能)总是接受 ISO 样式YYYY-MM-DD
和YYYYMMDD
日期,而不管DATESTYLE
. 观察:
regress=> SELECT '20121229'::date, '2012-12-29'::date, current_setting('DateStyle');
date | date | current_setting
------------+------------+-----------------
2012-12-29 | 2012-12-29 | ISO, MDY
(1 row)
regress=> SET DateStyle = 'DMY';
SET
regress=> SELECT '20121229'::date, '2012-12-29'::date, current_setting('DateStyle');
date | date | current_setting
------------+------------+-----------------
2012-12-29 | 2012-12-29 | ISO, DMY
(1 row)
...因此,如果 GreenPlum 的行为方式相同,则您无需执行任何操作即可YYYYMMDD
从输入文件中正确读取这些日期。
以下是它与 PostgreSQLfile_fdw
SQL/MED
外部数据包装器的工作方式:
CREATE EXTENSION file_fdw;
COPY (SELECT '20121229', '2012-12-29') TO '/tmp/dates.csv' CSV;
SET DateStyle = 'DMY';
CREATE SERVER csvtest FOREIGN DATA WRAPPER file_fdw;
CREATE FOREIGN TABLE csvtest (
date1 date,
date2 date
) SERVER csvtest OPTIONS ( filename '/tmp/dates.csv', format 'csv' );
SELECT * FROM csvtest ;
date1 | date2
------------+------------
2012-12-29 | 2012-12-29
(1 row)
CSV 文件内容为:
20121229,2012-12-29
因此您可以看到 Pg 将始终接受 CSV 的 ISO 日期,而不管日期样式如何。
如果 GreenPlum 没有,请提交一个错误。DateStyle
在创建后更改外部表的读取方式的想法是疯狂的。