有效地创建日期

时间:2010-05-14 08:06:08

标签: postgresql query-optimization

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万条记录,因此需要速度。)

谢谢!

3 个答案:

答案 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为每个查询的范围创建表格。