2016-05-16 50 views
1

只是試圖清理其他人在postgres中完成的某些功能。PSQL函數幫助 - 日期格式問題

有人會知道以下幾點嗎?這是工作,但日期格式改變時,它開始進入'1999-09-07 16:30:00.000'

我不知道以前的格式是什麼。

select 
case 
    when dbDate = '' then null 
    when dbDate != '^\d.*' then dbDate::timestamp 
    else '1900-01-01'::date + dbDate::int 
end as dbDate 

每當我調用該函數的日期這讓我

invalid input syntax for integer: "1999-09-07 16:30:00.000"

+2

你爲什麼鑄造'dbDate'爲整數? –

+1

我沒有寫代碼,所以我不確定。應該是dbDate :: timestamp? – emraldinho

回答

2

這個漂亮的功能正在採取多種類型的輸入日期和規範他們。

我認爲,預計中的一種:

  • 空白,它讓我們爲null
  • 日期格式以「MMM」的日期,其不會通過(即東西「^ \ d *」。不帶數字),它會轉換爲日期開始
  • 一些

的原因,日期正在鑄成的INT是因爲失敗的前兩個測試的PE後rson寫這是期待INT。他們希望像Excel一樣將整數加到Time的開始處(即1900-01-01)。

1999-09-07 16:30:00.000未能通過第二次測試,即使它可以作爲時間進行施法。

這會傳遞給else,它無法將其轉換爲INT,並引發錯誤。

在這種情況下,您需要更改第二次測試。使它能夠允許你進入的日期時間,但會拒絕應該添加到1900-01-01的數字。

如果你不認爲你將不得不在未來應加1900-01-01號碼,然後就擺脫了第三次試驗,並使用

select 
case 
    when dbDate = '' then null 
    else dbDate::timestamp 
end as dbDate 
+1

將取代命令是: 替換dateconverter選擇案例時,dbDate =''然後爲空其他dbDate :: timestamp結束爲dbDate – emraldinho

+0

老實說,我認爲這取決於以前的格式是什麼,以及您通常在dbdate上獲得什麼樣的數據領域。運行一個查詢來提取所有唯一的dbdate並將其簽出。如果在添加舊日期格式時看到大量有意義的整數,則可能需要對該功能進行一些更改以允許此數據。如果他們都是日期時間或zls你可以使用上述。 – EoinS

+0

此解決方案適合您嗎?如果您選擇INT而不是日期並獲得一些奇怪的日期時間,我們可以採用一種方式來接受傳入的INT並將其更改爲函數最初的日期。 – EoinS