web-dev-qa-db-fra.com

Comment trouvez-vous les résultats qui se sont produits la semaine dernière?

J'ai une table books avec un returned_date colonne. Je voudrais voir les résultats pour tous les livres avec une date de retour qui s'est produite au cours de la semaine dernière.

Des pensées? J'ai essayé de faire des calculs de datation, mais Postgres n'était pas satisfait de ma tentative.

42
Huuuze

Vous souhaitez utiliser interval et current_date:

select * from books where returned_date > current_date - interval '7 days'

Cela retournerait les données de la semaine dernière , y compris aujourd'hui.

En savoir plus sur l'utilisation des dates dans Postgres.

68
Eric

En supposant que returned_date Est en fait un type de données date, c'est plus simple, plus rapide et plus correct:

SELECT * FROM books WHERE returned_date > CURRENT_DATE - 7
  • now()::date est l'implémentation Postgres du SQL standard CURRENT_DATE . Les deux font exactement la même chose dans PostgreSQL.

  • CURRENT_DATE - 7 Fonctionne car on peut soustraire/ajouter integer valeurs (= jours) de/à un date . Un nombre sans guillemets comme 7 Est un littéral numérique par défaut à integer alors qu'il ne contient que des chiffres et un signe de tête facultatif, donc une conversion explicite n'est pas nécessaire.

  • Avec le type de données timestamp ou timestamptz vous devez ajouter/soustraire un interval, comme le démontre @Eric. Vous pouvez faire de même avec date, mais le résultat est timestamp et vous devez effectuer un cast en arrière sur date ou continuer à travailler avec timestamp. S'en tenir à date comme démontré est le moyen le plus simple et le plus rapide possible. Cependant, la différence de performances est généralement faible.

  • Le calcul est indépendant du type de données réel de returned_date, Le type résultant à droite de l'opérateur sera contraint à correspondre dans les deux sens (et générera une erreur si aucune conversion n'est enregistrée).

  • Pour " la semaine dernière ":

    • Pour inclure aujourd'hui , faites-en > current_date - 7 Ou >= current_date - 6.
    • Pour exclure aujourd'hui , faites-en BETWEEN current_date - 7 AND current_date - 1 (Ou similaire). >= current_date - 7 Comme d'autres réponses le suggèrent renvoie des lignes pour les derniers 8 jours au lieu de 7 et est faux, à proprement parler.

    • Pour obtenir la dernière semaine civile complète, se terminant le dimanche, sauf aujourd'hui:
      BETWEEN date_trunc('week', now())::date - 7 AND date_trunc('week', now())::date - 1

Notez que la définition exacte de "jour" et "semaine" dépend toujours de votre paramètre timezone actuel.

41
Erwin Brandstetter

Quel math as-tu essayé?

Cela devrait fonctionner

select * from books where current_date - integer '7'

Extrait de Fonctions et opérateurs de date/heure de PostgreSQL

0
mbillard