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.
@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);
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
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
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')