【问题标题】: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万条记录,所以需要速度。)

谢谢!

【问题讨论】:

    标签: postgresql query-optimization


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

        【讨论】:

        • 我看不出这会比生成系列提高性能:)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多