On Pavel's page是以下功能:
CREATE OR REPLACE FUNCTION makedate(year int, dayofyear int)
RETURNS date AS $$
SELECT (date '0001-01-01' + ($1 - 1) * interval '1 year' + ($2 - 1) * interval '1 day'):: date
$$ LANGUAGE sql;
我有以下代码:
makedate(y.year,1)
PostgreSQL中创建特定年份1月1日日期的最快方法是什么?
帕维尔的功能会让我相信它是:date '0001-01-01' + y.year * interval '1 year' + interval '1 day';
我的想法更像是:
to_date( y.year||'-1-1', 'YYYY-MM-DD');
我正在寻找使用PostgreSQL 8.4的最快方式。 (使用日期函数的查询可以选择100,000到100万条记录,因此需要速度。)
谢谢!
答案 0 :(得分:7)
我会使用以下内容,因为年份是持有年份的变量,而不是使用函数:
(year || '-01-01')::date
顺便说一下。我无法相信这种转变是你的瓶颈。但也许你应该看看generate_series(我不知道你的用例)。
select current_date + s.a as dates from generate_series(0,14,7) as s(a);
dates
------------
2004-02-05
2004-02-12
2004-02-19
(3 rows)
答案 1 :(得分:3)
使用to_date()比你想象的更简单:
> select to_date('2008','YYYY');
to_date
------------
2008-01-01
(1 row)
> select to_date(2008::text,'YYYY');
to_date
------------
2008-01-01
(1 row)
请注意,您仍然必须将年份作为字符串传递,但不需要连接。
答案 2 :(得分:0)
正如Daniel所建议的那样,在这种转换成为瓶颈的不太可能的情况下,您可能更愿意预先计算该函数并存储在表中。例如:
select ynum, to_date( ynum ||'-01-01', 'YYYY-MM-DD') ydate
from generate_series(2000,2009) as ynum;
如果有几年(因此不需要索引),您甚至可以使用新的WITH为每个查询的范围创建表格。