Heim > Datenbank > MySQL-Tutorial > Wie kann „tsrange' von PostgreSQL Abfragen für Geschäftszeiten vereinfachen?

Wie kann „tsrange' von PostgreSQL Abfragen für Geschäftszeiten vereinfachen?

DDD
Freigeben: 2025-01-05 02:04:41
Original
820 Leute haben es durchsucht

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

Betriebsstundenabfrage in PostgreSQL mit tsrange

Einführung

In PostgreSQL die Stunden Der Vorgang für eine bestimmte Entität kann als Paare ganzzahliger Spalten gespeichert werden, z. B. „opens_on“ und „closes_on“, die darstellen der Wochentag und „opens_at“ und „closes_at“, die die Tageszeit darstellen. Allerdings kann die Durchführung von Abfragen für solche Daten aufgrund möglicher Überschneidungen und Unregelmäßigkeiten im Zeitplan komplex sein.

Alternativer Ansatz mit tsrange

Um diese Komplexitäten zu bewältigen, ist ein effizienterer Ansatz erforderlich Der Ansatz beinhaltet die Verwendung des Datentyps tsrange, der einen Bereich von Zeitstempeln ohne Zeitzonen darstellt. Durch die Verwendung von tsrange können wir Betriebsstunden als Bereichssätze speichern. Dieser Ansatz bietet mehrere Vorteile:

Datenstruktur

CREATE TABLE hoo (
  hoo_id  serial PRIMARY KEY,
  shop_id int NOT NULL, -- REFERENCES shop(shop_id)
  hours   tsrange NOT NULL
);
Nach dem Login kopieren

Wenn beispielsweise ein Geschäft von Mittwoch 18:00 Uhr bis Donnerstag 5:00 Uhr UTC geöffnet ist, gelten die entsprechenden Öffnungszeiten Reichweite würde sein:

'[1996-01-03 18:30, 1996-01-04 05:00]'
Nach dem Login kopieren

Funktionen

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$;
Nach dem Login kopieren
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$;
Nach dem Login kopieren

Abfrage

Die ursprüngliche komplexe Abfrage kann jetzt sein durch die folgende Vereinfachung ersetzt Aussage:

SELECT *
FROM hoo
WHERE hours @> f_hoo_time(now());
Nach dem Login kopieren

Indexierung

Um die Abfrageleistung zu optimieren, kann ein SP-GiST-Index für Stunden erstellt werden:

CREATE INDEX hoo_hours_spgist_idx on hoo USING spgist (hours);
Nach dem Login kopieren

Leistung

Dieser Ansatz unter Verwendung des SP-GiST-Index bietet erhebliche Leistungsverbesserungen, insbesondere bei der Suche nach großen Zahlen der Ergebnisse. Es übertrifft andere Indexierungsstrategien und reduziert die Ausführungszeit sowohl für niedrige als auch für hohe Ergebniszahlen.

Das obige ist der detaillierte Inhalt vonWie kann „tsrange' von PostgreSQL Abfragen für Geschäftszeiten vereinfachen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage