2015-08-09 120 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