2015-01-04 37 views
-1

我有以下功能:日期轉換功能的PostgreSQL

CREATE function SEMANA_ISO (fecha date) returns text as $$ 
select to_char(fecha, 'mm-dd-yyyy'); 
$$ LANGUAGE sql; 

它適用於:

Select SEMANA_ISO ('28/12/2014'); 
Select SEMANA_ISO ('01/01/2015'); 
Select SEMANA_ISO ('01/07/2015'); 

正如你可以看到下面

Date

但不能與:

Select SEMANA_ISO ('12/31/2014'); 

它顯示:

********** Error ********** 

ERROR: The value of time/date is out of range "12/31/2014" 
SQL state: 22008 
Hint: You may need a different configuration of "dateStyle". 
Character: 20 

你有任何建議,而無需改變DATESTYLE這樣我就可以進入

Select SEMANA_ISO ('12/31/2014'); 

,並得到一個輸出:採用

12-31-2014 

只有一個功能來「解析」所有日期?

回答

0

如果你想12/31/2014接受作爲一個日期set datestyle to iso, dmy;

,如果你想31/12/2014接受作爲一個日期set datestyle to iso, mdy;

在同一時間,你不能兼得,否則4/1/2015是ambiguos,而且必須被拒絕。

+0

我知道。有了set datastyle句子,你可以這樣做。我想知道是否可以使用相同的功能來接受('12/31/2014')作爲其他值。感謝您的回答 –

1

您的函數聲明爲獲取date類型的參數,因此您還需要傳遞此類值。 '12/31/2014'是一個字符值,不是日期。

當您將字符文字(又名字符串)傳遞給函數Postgres被迫執行隱式基於當前datestyle的數據類型轉換 - 不是您應該依賴的東西。

如果您想獨立於日期樣式調用函數,則需要傳遞適當的日期文字,例如,例如, DATE '2014-12-31'

有關指定日期值的詳細信息,請參閱手冊:http://www.postgresql.org/docs/current/static/datatype-datetime.html#DATATYPE-DATETIME-INPUT

+0

我的問題是接受('28/12/2014')和其他兩個日期,但我不能使用相同的功能('12/31/2014')。我已經在這個數據庫管理系統中處理過數據類型,但是我的挑戰是接受最後一個日期而不改變任何日期樣式。 非常感謝您的回答 –

+0

@MichVellve:再次:''28/12/2014''是**不是**「日期」。它是隱式(!)*轉換爲基於當前日期樣式的日期的字符串字面量。從來沒有(真的:從不)依賴隱式數據類型轉換(對於任何DBMS都是如此)。你想隱式數據類型轉換神奇地檢測你真正的意思 - 這是不可能的。 「01-05-2015」呢?那是五月一日,還是那一月,五日?系統應該如何知道?如果您希望避免隨機出現的細微錯誤,您可**使用適當的日期文字(ansi文字或使用'to_date()')。 –

0

to_date()輸入日期文字具有任意(定)格式:

SELECT to_date('12/31/2014', 'MM/DD/YYYY') AS date1 
    , to_date('31/12/2014', 'DD/MM/YYYY') AS date2; 

這是「不改變任何日期式「。顯然,你需要提供一個匹配的格式模式。

爲了輸出任何所需的格式相同,使用to_char()

SELECT to_char(to_date('12/31/2014', 'MM/DD/YYYY'), 'DD/MM/YYYY') AS date_as_text 
+0

@MichVellve:因爲'YYYY-MM-DD'是默認的(ISO 8601)格式,用於表示Postgres中文本輸出中的日期值。要得到一個不同格式的字符串,可以使用'to_char()'。我將在上面添加一個示例。 –

+0

感謝您的解釋!我剛剛嘗試'12/31/2014',但是當我輸入SELECT to_char(to_date('28/12/2014','MM/DD/YYYY','DD/MM/YYYY')AS date_as_text時顯示:「15/04/2016」這篇文章從哪裏來? –

+0

@MichVellve:你***不能讓這個過程自動化。像'02/03/2014'這樣的字符串是不明確的,因此您需要根據相同的模式解釋它們或手動提供匹配模式。需要'to_date('28/12/2014','DD' **'/ MM' **'/ YYYY')'。 –