Selectionner les données du jour

La norme SQL évolue : tirez le meilleur d'un SGBD qui la respecte en écrivant du SQL moderne avec en complément PL/pgSQL, php, java etc.
Répondre
Phil
Administrateur du site
Messages : 194
Enregistré le : mar. 1 sept. 2015 00:38
Localisation : France
Contact :

Selectionner les données du jour

Message par Phil » 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 :

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)
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 :

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
Cdlt. Phil - pgphil.ovh

Répondre