2015-08-09 5 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 строк данных и, следя за тем, чтобы каждый из них был правильным, перед вставкой в ​​БД. Бэкэнд - это ручка рельсов, но я решил, что переходить через 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 столбцы и сделать UPDATE (и аналогично для integer и 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

Ahh okay, это была моя вторая предпосылка, заключалась в том, чтобы вставить их все как строки, а затем обновить позже, используя функцию to_date. Я думал, что будет более прямой способ сделать это. В моей инструкции CREATE TABLE я устанавливаю тип как DATE, но я просто CHAR, поскольку вы предложили загрузить их. – gary1410

+1

Я уверен, что вы также можете сделать преобразование в 'ALTER TABLE' с' USING to_date (текстовое поле, 'DD-MM-YY') ', поэтому вам не нужно сначала создавать столбцы temp, а затем отбрасывать предыдущие , –

+0

@SamiKuhmonen Да, конечно. Хорошее предложение. – Patrick

Смежные вопросы