263 votes

En soustrayant de 1 jour à partir d’une date timestamp

Je suis à l'aide de Datagrip pour Postgresql. J'ai une table avec un champ de date dans le format d'horodatage (ex: 2016-11-01 00:00:00). Je veux être en mesure de:

  1. appliquer un opérateur mathématique de soustraire 1 jour
  2. le filtre basé sur une fenêtre de temps d'aujourd'hui-130 jours
  3. affichage sans l'hh/mm/ss partie du timbre (2016-10-31)

Départ actuel de la requête:

select org_id, count(accounts) as count, ((date_at) - 1) as dateat 
from sourcetable 
where  date_at <= now() - 130
group by org_id, dateat

L' ((date_at)-1) clause sur la ligne 1:

[42883] ERREUR: opérateur n'existe pas: timestamp sans fuseau horaire - entier Astuce: Aucun opérateur correspond au nom donné et le type d'argument(s). Vous pourriez avoir besoin d'ajouter de type explicite jette. Position: 69

L' now() clause génère un message similaire:

[42883] ERREUR: opérateur n'existe pas: le timestamp avec le temps, la zone entier Astuce: Aucun opérateur correspond au nom donné et le type d'argument(s). Vous pourriez avoir besoin d'ajouter de type explicite jette. Position: ...

Les guides en ligne de type moulages sont singulièrement peu serviable. L'entrée est appréciée.

528voto

Michel Milezzi Points 4165

Utiliser l' INTERVAL de texte. E. g:

--yesterday
SELECT NOW() - INTERVAL '1 DAY';

--Unrelated to the question, but PostgreSQL also supports some shortcuts:
SELECT 'yesterday'::TIMESTAMP, 'tomorrow'::TIMESTAMP, 'allballs'::TIME;

Ensuite, vous pouvez effectuer les opérations suivantes sur votre requête:

SELECT 
    org_id,
    count(accounts) AS COUNT,
    ((date_at) - INTERVAL '1 DAY') AS dateat
FROM 
    sourcetable
WHERE 
    date_at <= now() - INTERVAL '130 DAYS'
GROUP BY 
    org_id,
    dateat;

Supplémentaires tip1

Vous pouvez ajouter plusieurs opérandes. E. g.: comment obtenir le dernier jour du mois en cours?

SELECT date_trunc('MONTH', CURRENT_DATE) + INTERVAL '1MONTH - 1DAY';

Supplémentaires tip2

Vous pouvez également créer un intervalle à l'aide de make_interval fonction utile lorsque vous avez besoin de le créer au moment de l'exécution (et non à l'aide de littéraux):

SELECT make_interval(days => 10+2);
SELECT make_interval(days => 1, hours => 2);
SELECT make_interval(0, 1, 0, 5, 0, 0, 0.0);

Plus d'infos ici et ici.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X