Создать дату эффективно - PullRequest
1 голос
/ 14 мая 2010

Вкл. Страница Павла - это следующая функция:

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 января данного года?

Функция Павла заставила бы меня поверить, что это:

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 до 1 миллиона записей, поэтому ему нужна скорость.)

Спасибо!

Ответы [ 3 ]

7 голосов
/ 14 мая 2010

Я бы просто использовал следующее, учитывая, что год является переменной, содержащей год, вместо использования функции:

(year || '-01-01')::date

Btw. Я не могу поверить, что это обращение - твое узкое место. Но, возможно, вам стоит взглянуть на 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)
3 голосов
/ 14 мая 2010

Использование 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)

Обратите внимание, что вы все равно должны указывать год в виде строки, но объединение не требуется.

0 голосов
/ 14 мая 2010

Как предположил Дэниел, в маловероятном случае, когда это преобразование является узким местом, вы можете предпочесть предварительно вычислить функцию и сохранить ее в таблице. Например:

 select ynum, to_date( ynum ||'-01-01', 'YYYY-MM-DD') ydate 
   from generate_series(2000,2009) as ynum;

Если есть несколько лет (и, следовательно, индексы не нужны), вы можете даже динамически создать таблицу для объема каждого запроса с новым WITH .

...