高效创建日期
Posted
技术标签:
【中文标题】高效创建日期【英文标题】:Create date efficiently 【发布时间】:2010-05-14 08:06:08 【问题描述】:在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 日创建日期的最快方法是什么?
Pavel 的函数会让我相信它是:
date '0001-01-01' + y.year * interval '1 year' + interval '1 day';
我的想法更像是:
to_date( y.year||'-1-1', 'YYYY-MM-DD');
我正在寻找使用 PostgreSQL 8.4 的最快方法。 (使用日期函数的查询可以选择10万到100万条记录,所以需要速度。)
谢谢!
【问题讨论】:
【参考方案1】:鉴于 year 是保存年份的变量,而不是使用函数,我将只使用以下内容:
(year || '-01-01')::date
顺便说一句。我不敢相信这种转换是你的瓶颈。但也许你应该看看 generate_series here(我不知道你的用例)。
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)
【讨论】:
【参考方案2】:使用 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)
请注意,您仍然必须将年份作为字符串传递,但不需要连接。
【讨论】:
【参考方案3】:正如 Daniel 所建议的,在这种转换不太可能成为瓶颈的情况下,您可能更愿意预先计算函数并将其存储在一个表中。例如:
select ynum, to_date( ynum ||'-01-01', 'YYYY-MM-DD') ydate
from generate_series(2000,2009) as ynum;
如果有几年(因此不需要索引),您甚至可以使用新的WITH 为每个查询的范围动态创建表。
【讨论】:
我看不出这会比生成系列提高性能:)以上是关于高效创建日期的主要内容,如果未能解决你的问题,请参考以下文章