web-dev-qa-db-fra.com

Comment comparer les dates dans les champs datetime dans Postgresql?

J'ai été confronté à un scénario étrange lors de la comparaison entre les dates dans postgresql (version 9.2.4 dans Windows). J'ai une colonne dans ma table dire update_date avec le type 'timestamp without timezone'. Le client peut effectuer une recherche dans ce champ avec uniquement la date (par exemple: 2013-05-03) ou la date avec l'heure (par exemple: 2013-05-03 12:20:00). Cette colonne a la valeur d'horodatage pour toutes les lignes actuellement et a la même partie de date (2013-05-03) mais la différence dans la partie d'heure.

Lorsque je compare sur cette colonne, j'obtiens des résultats différents. Comme les suivantes:

select * from table where update_date >= '2013-05-03' AND update_date <= '2013-05-03' -> No results

select * from table where update_date >= '2013-05-03' AND update_date < '2013-05-03' -> No results

select * from table where update_date >= '2013-05-03' AND update_date <= '2013-05-04' -> results found

select * from table where update_date >= '2013-05-03' -> results found

Ma question est comment puis-je rendre la première requête possible pour obtenir des résultats, je veux dire pourquoi la 3ème requête fonctionne mais pas la première?

Quelqu'un peut-il m'aider avec ça? Merci d'avance.

115
user2866264

@Nicolai a raison sur le transtypage et explique pourquoi la condition est fausse pour toutes les données. Je suppose que vous préférez le premier formulaire parce que vous voulez éviter la manipulation de la date sur la chaîne d'entrée, n'est-ce pas? vous n'avez pas besoin d'avoir peur:

SELECT *
FROM table
WHERE update_date >= '2013-05-03'::date
AND update_date < ('2013-05-03'::date + '1 day'::interval);
187
just somebody

Lorsque vous comparez update_date >= '2013-05-03', postgres convertit les valeurs dans le même type pour comparer les valeurs. Votre '2013-05-03' a donc été converti en '2013-05-03 00:00:00'. 

Donc, pour update_date = '2013-05-03 14:45:00', votre expression sera la suivante:

'2013-05-03 14:45:00' >= '2013-05-03 00:00:00' AND '2013-05-03 14:45:00' <= '2013-05-03 00:00:00'

Ceci est toujours false

Pour résoudre ce problème, mettez update_date en date:

select * from table where update_date::date >= '2013-05-03' AND update_date::date <= '2013-05-03' -> Will return result
30
Nicolai

Utilisez le type range. Si l'utilisateur entre une date:

select *
from table
where
    update_date
    <@
    tsrange('2013-05-03', '2013-05-03'::date + 1, '[)');

Si l'utilisateur entre des horodatages, vous n'avez pas besoin de la partie ::date + 1

http://www.postgresql.org/docs/9.2/static/rangetypes.html

http://www.postgresql.org/docs/9.2/static/functions-range.html

6
Clodoaldo Neto

Utilisez Date convert pour comparer avec la date: Essayez ceci:

select * from table 
where TO_DATE(to_char(timespanColumn,'YYYY-MM-DD'),'YYYY-MM-DD') = to_timestamp('2018-03-26', 'YYYY-MM-DD')
0
Yenky Bustamante