ダークサイドの助け
設計に行き詰まっていますが、これはこれまでに提案されたどのソリューションよりもシンプルで高速である必要があります: ad-hoc row types :
SELECT *
FROM tbl
WHERE (year, month, day) BETWEEN (2013,7,3)
AND (2013,7,5);
ここでdb<>fiddle
古いsqlfiddle
適切な解決策
しかし、実際には、最初から適切なテーブル デザインを使用する必要があります。date日付を 3integer列ではなく として保存します。これにより、担保利益として有効な日付が強制されます。
CREATE TABLE tbl (
tbl_id serial PRIMARY KEY
, thedate date NOT NULL
);
thedate、の 3 つの列すべてが含まれday、のように 4 バイトが必要です。monthyearinteger
次に、タスクは簡単です。
日、月、年、または任意の形式の任意のサブユニットを取得するにはto_char()、 、extract()、またはを使用しますdate_trunc()。これらの関数は非常に高速で用途が広いです。
現在のテーブルとまったく同じようにVIEW見えるを作成できます。
CREATE view old_table AS
SELECT tbl_id
, EXTRACT(day FROM thedate)::int AS day
, EXTRACT(month FROM thedate)::int AS month
, EXTRACT(year FROM thedate)::int AS year
FROM my_table;
ソースが小さいため、少なくともテーブルと同じくらい高速です。