Selectionner les données du jour
Posté : mer. 21 nov. 2018 18:24
Merci à Anne pour sa question :
"J'ai une table t1 avec colonne c1 de type timestamp, j'aimerais obtenir toutes les lignes avec les données du jour.
Dans la colonne c1, il peut y avoir des dates dans le futur mais elles ne sont pas à prendre en compte. Il faut uniquement les données du jour."
Réponse :
Il est préférable de ne pas appliquer de fonctions sur la colonne c1 afin de bénéficier d'un éventuel index.
Une solution est simplement de filtrer sur c1 en prenant les valeurs entre current_date (le jour courant au début de la transaction) et current_timestamp (le timestamp courant au début de la transaction).
Exemple :
Attention, si le code doit aussi être compatible avec Oracle Database c'est un peu plus compliqué.
Leur type date est en fait un datetime. Dans la même logique, current_date inclut donc heures, minutes, secondes.
Il faut utiliser la fonction "trunc" pour ramener la précision au jour.
Exemple :
"J'ai une table t1 avec colonne c1 de type timestamp, j'aimerais obtenir toutes les lignes avec les données du jour.
Dans la colonne c1, il peut y avoir des dates dans le futur mais elles ne sont pas à prendre en compte. Il faut uniquement les données du jour."
Réponse :
Il est préférable de ne pas appliquer de fonctions sur la colonne c1 afin de bénéficier d'un éventuel index.
Une solution est simplement de filtrer sur c1 en prenant les valeurs entre current_date (le jour courant au début de la transaction) et current_timestamp (le timestamp courant au début de la transaction).
Exemple :
Code : Tout sélectionner
select version();
version
---------------------------------------------------------------------------------------------------------------
PostgreSQL 11.1 (Debian 11.1-1.pgdg+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.2.0-9) 8.2.0, 64-bit
(1 ligne)
create table t1(c1 timestamp);
CREATE TABLE
insert into t1(c1) values(current_date-1),(current_date),(current_timestamp),(current_date+1);
INSERT 0 4
table t1;
c1
----------------------------
2018-11-20 00:00:00
2018-11-21 00:00:00
2018-11-21 17:07:55.986478
2018-11-22 00:00:00
(4 lignes)
select c1 from t1 where c1 between current_date and current_timestamp;
c1
----------------------------
2018-11-21 00:00:00
2018-11-21 17:07:55.986478
(2 lignes)
Leur type date est en fait un datetime. Dans la même logique, current_date inclut donc heures, minutes, secondes.
Il faut utiliser la fonction "trunc" pour ramener la précision au jour.
Exemple :
Code : Tout sélectionner
Connecte a :
Oracle Database 18c Express Edition Release 18.0.0.0.0 - Production
Version 18.4.0.0.0
create table t1(c1 timestamp);
Table creee.
insert into t1(c1) values(trunc(current_date)-1);
1 ligne creee.
insert into t1(c1) values(trunc(current_date));
1 ligne creee.
insert into t1(c1) values(current_timestamp);
1 ligne creee.
insert into t1(c1) values(trunc(current_date)+1);
1 ligne creee.
select c1 from t1;
C1
---------------------------------------------------------------------------
20/11/18 00:00:00,000000
21/11/18 00:00:00,000000
21/11/18 18:09:00,224947
22/11/18 00:00:00,000000
select c1 from t1 where c1 between current_date and current_timestamp;
aucune ligne selectionnee
select c1 from t1 where c1 between trunc(current_date, 'J') and current_timestamp;
C1
---------------------------------------------------------------------------
21/11/18 00:00:00,000000
21/11/18 18:09:00,224947
select c1 from t1 where c1 between trunc(current_date, 'DD') and current_timestamp;
C1
---------------------------------------------------------------------------
21/11/18 00:00:00,000000
21/11/18 18:09:00,224947
select c1 from t1 where c1 between trunc(current_date) and current_timestamp;
C1
---------------------------------------------------------------------------
21/11/18 00:00:00,000000
21/11/18 18:09:00,224947