Rumah > pangkalan data > tutorial mysql > Bagaimanakah `tsrange` PostgreSQL Boleh Memudahkan Pertanyaan untuk Waktu Operasi Perniagaan?

Bagaimanakah `tsrange` PostgreSQL Boleh Memudahkan Pertanyaan untuk Waktu Operasi Perniagaan?

DDD
Lepaskan: 2025-01-05 02:04:41
asal
818 orang telah melayarinya

How Can PostgreSQL's `tsrange` Simplify Queries for Business Hours of Operation?

Waktu Pertanyaan Operasi dalam PostgreSQL Menggunakan tsrange

Pengenalan

Dalam PostgreSQL, jam operasi untuk entiti tertentu boleh disimpan sebagai pasangan lajur integer, seperti opens_on dan closes_on, mewakili hari bekerja, dan opens_at dan closes_at, mewakili masa dalam hari. Walau bagaimanapun, melaksanakan pertanyaan pada data sedemikian boleh menjadi rumit kerana kemungkinan pertindihan dan penyelewengan dalam jadual.

Pendekatan Alternatif dengan tsrange

Untuk menangani kerumitan ini, kaedah yang lebih cekap pendekatan melibatkan penggunaan jenis data tsrange, yang mewakili julat cap masa tanpa zon masa. Dengan menggunakan tsrange, kami boleh menyimpan waktu operasi sebagai set julat. Pendekatan ini menawarkan beberapa faedah:

Struktur Data

CREATE TABLE hoo (
  hoo_id  serial PRIMARY KEY,
  shop_id int NOT NULL, -- REFERENCES shop(shop_id)
  hours   tsrange NOT NULL
);
Salin selepas log masuk

Sebagai contoh, jika kedai dibuka dari hari Rabu 6 petang hingga Khamis 5 pagi UTC, waktu yang sepadan julat akan jadi:

'[1996-01-03 18:30, 1996-01-04 05:00]'
Salin selepas log masuk

Fungsi

CREATE OR REPLACE FUNCTION f_hoo_time(timestamptz)
  RETURNS timestamp
  LANGUAGE sql IMMUTABLE PARALLEL SAFE AS
$func$
SELECT timestamp '1996-01-01' + ( AT TIME ZONE 'UTC' - date_trunc('week',  AT TIME ZONE 'UTC'))
$func$;
Salin selepas log masuk
CREATE OR REPLACE FUNCTION f_hoo_hours(_from timestamptz, _to timestamptz)
  RETURNS TABLE (hoo_hours tsrange)
  LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE COST 500 ROWS 1 AS
$func$
DECLARE
   ts_from timestamp := f_hoo_time(_from);
   ts_to   timestamp := f_hoo_time(_to);
BEGIN
   -- Perform sanity checks and split ranges at Sunday midnight if necessary.
   ...
END
$func$;
Salin selepas log masuk

Pertanyaan

Pertanyaan kompleks asal kini boleh digantikan dengan yang dipermudahkan berikut pernyataan:

SELECT *
FROM hoo
WHERE hours @> f_hoo_time(now());
Salin selepas log masuk

Pengindeksan

Untuk mengoptimumkan prestasi pertanyaan, indeks SP-GiST pada jam boleh dibuat:

CREATE INDEX hoo_hours_spgist_idx on hoo USING spgist (hours);
Salin selepas log masuk

Prestasi

Pendekatan menggunakan indeks SP-GiST ini menawarkan peningkatan prestasi yang ketara, terutamanya apabila mencari hasil yang banyak. Ia mengatasi strategi pengindeksan lain dan mengurangkan masa pelaksanaan untuk kedua-dua kiraan hasil rendah dan tinggi.

Atas ialah kandungan terperinci Bagaimanakah `tsrange` PostgreSQL Boleh Memudahkan Pertanyaan untuk Waktu Operasi Perniagaan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan