ダークサイドの助け
設計に行き詰まっていますが、これはこれまでに提案されたどのソリューションよりもシンプルで高速である必要があります: 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 バイトが必要です。month
year
integer
次に、タスクは簡単です。
日、月、年、または任意の形式の任意のサブユニットを取得するには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;
ソースが小さいため、少なくともテーブルと同じくらい高速です。