Maison >base de données >tutoriel mysql >Comment puis-je interroger efficacement les heures de bureau dans PostgreSQL à l'aide de « tsrange » ?

Comment puis-je interroger efficacement les heures de bureau dans PostgreSQL à l'aide de « tsrange » ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-04 14:26:38229parcourir

How Can I Efficiently Query Business Hours in PostgreSQL Using `tsrange`?

Exécution de cette requête sur les heures de bureau dans PostgreSQL

La question d'origine illustre l'utilisation de SQL pour interroger des enregistrements qui correspondent à une plage d'heures de travail spécifique dans une application ActiveRecord (RoR). La requête utilise des conditions complexes pour comparer le moment actuel avec la valeur stockée. La question soulève la question de savoir si cela est possible en convertissant la valeur temporelle en un type de date et en laissant PostgreSQL gérer la comparaison.

Bonne pratique : utilisez le type tsrange

Pour résoudre ce problème, il est recommandé d'utiliser le type de données tsrange (plage de temps) de PostgreSQL pour stocker les heures d'ouverture. tsrange vous permet de stocker les heures ouvrées exprimées sous forme de périodes, et PostgreSQL fournit des fonctions et des opérateurs intégrés pour manipuler ces plages.

Modifications de schéma

Pour ce faire, vous devez apporter des modifications de schéma à la table existante :

ALTER TABLE hours_of_operations
ALTER COLUMN opens_on TYPE TIMESTAMP
ALTER COLUMN closes_on TYPE TIMESTAMP
ALTER COLUMN opens_at TYPE TIME
ALTER COLUMN closes_at TYPE TIME

Créez une nouvelle colonne hours pour stocker la valeur tsrange :

ALTER TABLE hours_of_operations
ADD COLUMN hours TSrange

Ensuite, utilisez l'instruction suivante pour mettre à jour les heures Colonne :

UPDATE hours_of_operations
SET hours = tsrange(opens_on || ' ' || opens_at, closes_on || ' ' || closes_at)

Condition de requête

Après avoir mis à jour la structure de la table, vous pouvez écrire une requête SQL plus concise et efficace pour répondre aux exigences de la question d'origine :

SELECT *
FROM hours_of_operations
WHERE current_timestamp @> hours

Cette requête utilise l'opérateur @> pour vérifier si l'heure actuelle se situe dans la plage d'heures stockée. Si vous devez prendre en compte des problèmes de fuseau horaire, utilisez la fonction d'heure appropriée pour convertir l'heure actuelle en UTC ou en un autre fuseau horaire souhaité.

Avantages

Les avantages de l'utilisation de tsrange incluent :

  • La requête est simple et facile à comprendre.
  • Évitez les logiques de comparaison complexes et améliorez les performances.
  • Prend en charge les horaires de travail complexes, tels que ceux qui s'étendent sur une journée ou sur un cycle de colis.
  • Peut être utilisé avec d'autres fonctions et index liés au temps fournis par PostgreSQL.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn