2015-08-09 86 views
1

我有这个数据集是SQL格式。然而DATE类型需要转换成不同的格式,因为我碰到下面的错误Postgres数据类型转换

CREATE TABLE 
INSERT 0 1 
INSERT 0 1 
INSERT 0 1 
INSERT 0 1 
ERROR: date/time field value out of range: "28-10-96" 
LINE 58: ...040','2','10','','P13-00206','','','','','1-3-95','28-10-96'... 
                 ^
HINT: Perhaps you need a different "datestyle" setting. 

我肯定读日期格式 http://www.postgresql.org/docs/current/static/datatype-datetime.html

的文档,但我的问题是我怎么转换所有的日期以适当的格式,而不需要经过所有500个左右的数据行,并确保在插入数据库之前每个数据都是正确的。后端是通过rails处理的,但我想通过SQL来清理它将是最好的。

我有一个CREATE TABLE声明此数据集以上,并记住你的数据集被给定为通过DBF转换器/外部电源

这里是我的数据集的一部分

INSERT INTO winery_attributes 
    (ID,NAME,STATUS,BLDSZ_ORIG,BLDSZ_CURR,HAS_CAVE,CAVESIZE,PROD_ORIG,PROD_CURR,TOUR_TASTG,VISIT_DAY,VISIT_WEEK,VISIT_YR,VISIT_MKTG,VISIT_NMEV,VISIT_ALL,EMPLYEENUM,PARKINGNUM,WDO,LAST_UP,IN_CITYBDY,IN_AIASP,NOTES,SMLWNRYEXM,APPRV_DATE,ESTAB_DATE,TOTAL_SIZE,SUBJ_TO_75,GPY_AT_75,AVA,SUP_DIST) 
VALUES 
    (1,'ACACIA WINERY','PROD','8000','34436','','0','50000','250000','APPT','75','525','27375','3612','63','30987','22','97','x','001_02169-MOD_AcaciaWinery','','','','','1-11-79','1-9-82','34436','x','125000','Los Carneros','1'); 

INSERT INTO winery_attributes 
    (ID,NAME,STATUS,BLDSZ_ORIG,BLDSZ_CURR,HAS_CAVE,CAVESIZE,PROD_ORIG,PROD_CURR,TOUR_TASTG,VISIT_DAY,VISIT_WEEK,VISIT_YR,VISIT_MKTG,VISIT_NMEV,VISIT_ALL,EMPLYEENUM,PARKINGNUM,WDO,LAST_UP,IN_CITYBDY,IN_AIASP,NOTES,SMLWNRYEXM,APPRV_DATE,ESTAB_DATE,TOTAL_SIZE,SUBJ_TO_75,GPY_AT_75,AVA,SUP_DIST) 
VALUES 
    ('2','AETNA SPRING CELLARS','PROD','2500','2500','','0','2000','20000','TST APPT','0','3','156','0','0','156','1','10','x','','','','','x','1-4-86','1-6-86','2500','','0','Napa Valley','3'); 

INSERT INTO winery_attributes 
    (ID,NAME,STATUS,BLDSZ_ORIG,BLDSZ_CURR,HAS_CAVE,CAVESIZE,PROD_ORIG,PROD_CURR,TOUR_TASTG,VISIT_DAY,VISIT_WEEK,VISIT_YR,VISIT_MKTG,VISIT_NMEV,VISIT_ALL,EMPLYEENUM,PARKINGNUM,WDO,LAST_UP,IN_CITYBDY,IN_AIASP,NOTES,SMLWNRYEXM,APPRV_DATE,ESTAB_DATE,TOTAL_SIZE,SUBJ_TO_75,GPY_AT_75,AVA,SUP_DIST) 
VALUES 
    ('3','ALTA VINEYARD CELLAR','PROD','480','480','','0','5000','5000','NO','0','4','208','0','0','208','4','6','x','003_U-387879','','','','','2-5-79','1-9-80','480','','0','Diamond Mountain District','3'); 

INSERT INTO winery_attributes 
    (ID,NAME,STATUS,BLDSZ_ORIG,BLDSZ_CURR,HAS_CAVE,CAVESIZE,PROD_ORIG,PROD_CURR,TOUR_TASTG,VISIT_DAY,VISIT_WEEK,VISIT_YR,VISIT_MKTG,VISIT_NMEV,VISIT_ALL,EMPLYEENUM,PARKINGNUM,WDO,LAST_UP,IN_CITYBDY,IN_AIASP,NOTES,SMLWNRYEXM,APPRV_DATE,ESTAB_DATE,TOTAL_SIZE,SUBJ_TO_75,GPY_AT_75,AVA,SUP_DIST) 
VALUES 
    ('4','BLACK STALLION','PROD','43600','43600','','0','100000','100000','PUB','50','350','18200','0','0','18200','2','45','x','P13-00391','','','','','1-5-80','1-9-85','43600','','0','Oak Knoll District of Napa Valley','3'); 

INSERT INTO winery_attributes 
    (ID,NAME,STATUS,BLDSZ_ORIG,BLDSZ_CURR,HAS_CAVE,CAVESIZE,PROD_ORIG,PROD_CURR,TOUR_TASTG,VISIT_DAY,VISIT_WEEK,VISIT_YR,VISIT_MKTG,VISIT_NMEV,VISIT_ALL,EMPLYEENUM,PARKINGNUM,WDO,LAST_UP,IN_CITYBDY,IN_AIASP,NOTES,SMLWNRYEXM,APPRV_DATE,ESTAB_DATE,TOTAL_SIZE,SUBJ_TO_75,GPY_AT_75,AVA,SUP_DIST) 
VALUES 
    ('5','ALTAMURA WINERY','PROD','11800','11800','x','3115','50000','50000','APPT','0','20','1040','0','0','1040','2','10','','P13-00206','','','','','1-3-95','28-10-96','14915','x','50000','Napa Valley','4'); 
+0

你会遇到“28-10-96”的问题。可能是你有英文配置(MM-DD-YY) –

回答

0

的日期在你的数据集以字符串的形式存在。由于他们是不是在默认datestyle(也就是YYYY-MM-DD),你应该明确地将其转换为date如下:

to_date('1-5-80', 'DD-MM-YY') 

如果存储在timestamp不是数据,使用

to_timestamp('1-5-80', 'DD-MM-YY') 

如果你给出的数据中,你展现INSERT报表的形式设置,那么首先将数据作为简单的字符串加载到varchar列,然后添加date列和integer做一个UPDATE(类似与boolean列):

UPDATE my_table 
SET estab = to_date(ESTAB_DATE, 'DD-MM-YY'), -- column estab of type date 
    apprv = to_date(APPRV_DATE, 'DD-MM-YY'), -- etc 
    ... 

当更新完成后,你可以ALTER TABLE与日期(整数,布尔值删除文本列)。

+0

啊好吧,那是我第二次猜测,是将它们全部作为字符串插入,然后使用to_date函数稍后更新。我认为会有更直接的方式来做到这一点。在我的CREATE TABLE语句中,我将类型设置为DATE,但我只是按照您的建议将它们加载到CHAR中。 – gary1410

+1

我敢肯定,你也可以在'ALTER TABLE'中使用to_date(textfield,'DD-MM-YY')'来进行转换,所以你不必先创建临时列,然后删除以前的列。 –

+0

@SamiKuhmonen当然可以。好建议。 – Patrick