2011-12-28 26 views
4

给出INT:2009年,2010等
我想转换此信息DATE(一月一日)。PostgreSQL的 - 转换年初至今

我的解决方案(我更喜欢第一个):

(year::char || '-01-01')::DATE 
'0001-01-01' + ((year-1)::char || ' year')::interval 

有没有更好的(在建),或者更优雅和更快的解决方案?
(我目前正在工作的PostgreSQL 8.4,但也有兴趣在最近的版本。)

+2

问题描述有点松散:PostgreSQL(8.4)没有单参数'to_char()'也没有TINYINT类型。 – pilcrow 2011-12-28 15:24:55

+1

在SQL中,字符串文字是单引号“-01-01”。双引号是为标识符保留的。 – 2011-12-28 19:29:33

+1

看那些引用字符!值的单引号,标识符的双引号(仅适用于模式的部分:列名称等) – araqnid 2011-12-28 19:30:27

回答

7

我觉得这是最简单的方法:

to_date(year::varchar, 'yyyy') 
+1

在PostgreSQL中,'text'优于'varchar'。如果我正确阅读PostgreSQL手册,''yyyy''应该是'YYYY'。 – vog 2016-12-12 09:38:20

1

一种可能性:

select year * '1 year'::interval + '0000-01-01'::date; 

我喜欢这种方式,因为它避免了文字和整数(一旦所有的常量分析)之间的转换。

+0

有趣的方法。但是,它给出了错误:日期/时间字段值超出范围:“9.1.1”下的“0000-01-01”。 – pilcrow 2011-12-29 15:13:01

+0

此外,作为一个微不足道的观察,这个配方将返回一个TIMESTAMP无时区而不是日期,尽管我怀疑在一般情况下根本不重要。 – pilcrow 2011-12-29 15:19:06

+0

啊,我正在测试一个pg8.3实例。也许这取决于如果你用浮点和int时间构建? – araqnid 2011-12-29 19:23:05

4
SELECT to_date(2011::text, 'YYYY'); 

注意:根据默认从文本中铸造日期的任何代码是坏的。有人可以将默认格式datestyle更改为某些意想不到的值,并且此代码失败。使用to_date或to_timestamp是非常可取的。 to_dateto_timestamp相对昂贵,但它坚如磐石。

+1

+1 * DateStyle *警告。然而,在这个特定的例子中,是否有任何* DateStyle *输入模式不能正确理解YYYY-MM-DD? ([docs](http://www.postgresql.org/docs/current/static/datatype-datetime.html#DATATYPE-DATETIME-DATE-TABLE)暗示没有。) – pilcrow 2011-12-29 15:27:45

+0

我希望如此YYYY-MM- DD或YYYYMMDD将在任何地方被解析 - 但不能保证。 – 2011-12-29 16:33:57