2012-01-28 92 views
0

我有一個數據集(以.tsv格式)其中一列是出生日期。但是,數據是舊的,並不是所有的日期格式都是YYYY-MM-DD。有些參賽作品的出生年份(出生月份和出生日期均已丟失),格式爲YYYY-##-##(字面上##已插入數據,只有已知年份)。我希望將此數據集加載到我的postgres數據庫中,其中出生日期列的數據類型爲date,而不是string,以便我可以對日期進行比較。
下面顯示了一個小樣本。 (數據的不相關的列未示出)Postgresql日期格式

1924-##-## 
1965-09-04 
1944-11-05 
1951-##-## 
-388-##-## 
1893-01-26 
1037-##-## 

直接批量加載數據集明顯給出錯誤

ERROR: invalid input syntax for type date: "1924-##-##" 
LINE 1: insert into d values ('1924-##-##'); 
          ^

對數據集進行相當大的,具有約6億盧比條目。目前我正在考慮運行一個腳本,用01替換這些##的腳本,然後將修改後的數據插入到數據庫中。但我不喜歡這個想法 -

  1. 這是非常耗時的。
  2. 這是磁盤空間消耗(因爲我想保留原始的「umtampered」數據)
  3. 此外,並非所有的數據在我的數據庫中都是真實的。

有沒有什麼辦法可以讓postgres以某種方式把日期變成現實,只是忽略了##(s)(並且只保留了幾個月和幾天都沒有的年份)呢?
或者有沒有更好的解決方案來解決這個問題?

回答

0

你在這裏

  1. 兩個選項一旦你從數據庫讀取數據,更換#中出現的所有服務器端腳本,然後比較的日期。 (您也可以在表格中動態替換數據,而無需在查詢中使用if條件修改現有數據)
  2. 忽略具有#的日期。這樣你可以比較只有有效的日期。
0

如果您需要保留#個字符,我所看到的唯一機會是將其導入varchar列。

如果您絕對需要這些信息作爲日期,那麼您可能會忽略轉換的視圖,並且只會選擇列中沒有#的那些行。

喜歡的東西

SELECT to_date(dob,'YYYY-MM-DD') as dob_date 
FROM your_table 
WHERE substr(dob,6,2) <> '##'; 

如果你這樣做定期,你可能要考慮對錶達的索引,以加快選擇:

CREATE INDEX dob_check ON your_table(substr(dob,6,2)); 

注意的是,在表達您的選擇必須匹配,確切地說索引中的表達式才能被查詢平面器使用。

如果您希望將數據「轉換」爲檢索過程中有效的日期,你可以做這樣的事情:

SELECT case 
     case when substr(dob,6,2) = '##' then to_date(substr(dob,1,5)||'01-01', 'YYYY-MM-DD') 
     else to_date(dob,'YYYY-MM-DD') 
     end as dob_date 
FROM your_table; 
1

您可以在表中創建兩列,一個原先輸入的值(類型的varchar)和一個用於計算(鍵入日期)。

CREATE TABLE your_table 
(
id INT, 
-- OTHER DETAILS 
dob_entered VARCHAR, 
dob_parsed DATE 
); 

然後可以使用上一個INSERT觸發器從VARCHAR自動填充日期字段,通過更新觸發器來處理任何變化。

CREATE OR REPLACE FUNCTION evaluate_dob_date() RETURNS TRIGGER AS 
$$ 
BEGIN 
    NEW.dob_parsed = CAST(REPLACE(NEW.dob_entered,'##','01') AS DATE); 
    RETURN new; 
END; 
$$ 
LANGUAGE plpgsql; 

CREATE TRIGGER parse_dob 
BEFORE INSERT OR UPDATE ON your_table 
FOR EACH ROW 
EXECUTE PROCEDURE evaluate_dob_date(); 

這將意味着你同時存儲不變覈實原先輸入的數據,同時還具有在數據庫中適合進行排序和比較等。另外一個日期字段,通過擴展evaluate_dob_date()功能可以匹配針對不同但是仍然能夠拒絕真正無效的記錄。

Postgresql triggers

+0

Upvoted但只是一個小附記,你實際上並沒有存儲date_parsed。你可以做一些類似table的方法,然後限制它的輸出,所以你知道你的輸入日期總是被解析。有關表格方法的更多信息,請參閱我寫的這篇博客文章:http://ledgersmbdev.blogspot.com/2012/08/postgresql-or-modelling-part-2-intro-to.html – 2012-09-08 05:15:35