高效创建日期

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

【讨论】:

我看不出这会比生成系列提高性能:)

以上是关于高效创建日期的主要内容,如果未能解决你的问题,请参考以下文章

java日期格式化

如何高效查询事件查看器

创建一个高效的函数

如何使用 Python 基于交易数据高效地创建用户图?

UITableView:创建索引的最高效方式?

创建简单高效值类型的模式