2011-12-28 27 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