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.
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.
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 ":
> 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.
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