私は PostgreSQL にかなり慣れていませんが、最近私のプロジェクトで、特定の週のすべてのレコードを取得する際に問題が発生しました。もちろん、主な問題は境界週 (1 および 52/53) にあります。
このために、私は関数を書きました:
CREATE OR REPLACE FUNCTION week_dates(_week integer, _year integer) RETURNS date[] AS $$
DECLARE
result date[];
BEGIN
WITH RECURSIVE dates(wdate) AS (
SELECT MAX(date) AS wdate FROM time WHERE woy = _week AND year = _year AND dow > 3
UNION ALL
SELECT wdate-1 AS wdate FROM dates WHERE EXTRACT(WEEK from (wdate-1)) = _week
),
dates2(wdate) AS (
SELECT MAX(wdate) AS wdate FROM dates
UNION ALL
SELECT wdate+1 AS wdate FROM dates WHERE EXTRACT(WEEK from (wdate+1)) = _week
),
sorted AS ((SELECT * FROM dates) UNION (SELECT * FROM dates2) ORDER BY wdate ASC)
-- sorted AS (SELECT wdate FROM dates ORDER BY wdate ASC)
SELECT array_agg(wdate) INTO result FROM sorted;
-- SELECT wdate FROM sorted;
RETURN result;
END;
$$ LANGUAGE plpgsql;
そして、その使用法は、例えば次のとおりです。
SELECT * FROM "some_report_cache_table" WHERE "date" = ANY(week_dates(1, 2013));
これに対するより優れた/より高速な/より簡単なソリューションはありますか (おそらくいくつかの組み込み機能)?
私は PostgreSQL 9.2 を使用しています。週とは、ISO の週を意味します (月曜日から始まります)。