日期转换函数PostgreSQL

时间:2015-01-04 08:48:02

标签: postgresql date

我有以下功能:

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

您是否有任何建议而无需更改日期风格,以便我可以输入

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

获得输出:

12-31-2014 

只使用一个函数来解析"所有日期?

3 个答案:

答案 0 :(得分:1)

声明您的函数获取类型date的参数,因此您还需要传递这样的值。 '12/31/2014'是字符值,而不是日期。

当你将一个字符文字(又名字符串)传递给函数时,Postgres被迫根据当前日期样式进行隐式数据类型转换 - 而不是你应该依赖的东西。

如果您想独立于日期风格调用该函数,则需要传递正确的日期文字,例如DATE '2014-12-31'

有关指定日期值的详细信息,请参阅手册:http://www.postgresql.org/docs/current/static/datatype-datetime.html#DATATYPE-DATETIME-INPUT

答案 1 :(得分:0)

如果您希望12/31/2014被接受为日期set datestyle to iso, dmy;

如果您希望31/12/2014被接受为日期set datestyle to iso, mdy;

你不能同时拥有两个,否则4/1/2015是ambiguos,必须被拒绝。

答案 2 :(得分:0)

to_date()以任意(给定)格式输入日期文字:

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

&#34> "而不更改任何日期风格" 。显然,您需要提供匹配的格式模式。

要以任何所需格式输出相同内容,请使用to_char()

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