Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/04/2011, 14h24   #1
Futur Membre du Club
 
Inscription : février 2007
Messages : 56
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 56
Points : 17
Points : 17
Par défaut Regrouper des dates sur jour moi annee

Bonjour,

Désolé si ma question parait simple j'ai cherché et aucune des syntaxes que j'ai essayé n'a fonctionné ou retourné ce que je souhaite... pourtant je suis persuadé qu'il y a un moyen.

Dans une table j'ai un champ date_stat au format date.
Le truc c'est qu'il y a n enregistrements avec des dates similaires et où juste les heures diffèrent:
Citation:
DATE_STAT
-------------------
18/04/2011 00:00:05
18/04/2011 08:00:05
18/04/2011 12:30:05
...
21/04/2011 00:10:05
21/04/2011 01:00:05
21/04/2011 10:00:05
...
22/04/2011 00:40:00
22/04/2011 05:00:00
...
Je souhaiterais pouvoir extraire uniquement les "dates", quelque chose comme ça:
Code :
1
2
3
SELECT TO_CHAR(date_stat, 'DD/MM/YYYY') AS TS FROM MA_TABLE
  GROUP BY TO_CHAR(date_stat, 'DD/MM/YYYY')
ORDER BY TO_CHAR(date_stat, 'YYYYMMDDHH24MISS') ASC
et obtenir un résultat tel quel:
Citation:
18/04/2011
21/04/2011
22/04/2011
...
J'avais également essayé de faire un select UNIQUE devant le to_char mais ça n'est pas une syntaxe correcte non plus...

L'un de vous saurait-il m'aiguiller vers la solution ?

Merci d'avance
madmaxou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 15h08   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 442
Points : 10 442
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Vous n'êtes pas très loin de la solution :
Code :
1
2
3
  SELECT DISTINCT TO_CHAR(date_stat, 'DD/MM/YYYY') AS TS
    FROM MA_TABLE
ORDER BY trunc(date_stat, 'D') ASC;
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 15h09   #3
Membre éprouvé
 
Avatar de xdescamp
 
Homme Xavier Descamps
Inscription : octobre 2008
Messages : 297
Détails du profil
Informations personnelles :
Nom : Homme Xavier Descamps
Âge : 36
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2008
Messages : 297
Points : 422
Points : 422
Envoyer un message via Skype™ à xdescamp
Citation:
Envoyé par madmaxou Voir le message
Code :
1
2
3
SELECT TO_CHAR(date_stat, 'DD/MM/YYYY') AS TS FROM MA_TABLE
  GROUP BY TO_CHAR(date_stat, 'DD/MM/YYYY')
ORDER BY TO_CHAR(date_stat, 'YYYYMMDDHH24MISS') ASC
Presque!
On ne peut pas trier sur une information qu'on souhaite supprimer, à savoir les heures / minutes / secondes.
Le mieux est de tronquer les dates pour ne garder que les jours et pour autant garder une donnée de type DATE :
Code :
1
2
3
SELECT TRUNC(date_stat, 'DAY') AS TS FROM MA_TABLE
  GROUP BY TRUNC(date_stat, 'DAY')
ORDER BY TRUNC(date_stat, 'DAY') ASC
xdescamp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 15h21   #4
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 442
Points : 10 442
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Tient oui j'étais persuadé qu'Oracle remarquerait que le to_char et l'order by s'appliquent sur la même colonne, ce qui après essai ne fonctionne pas.

La solution de xdescamp fonctionnera si votre nls_date_format et bien dd/mm/yyyy.

Sinon il faut le convertir avec to_char :
Code :
1
2
3
4
5
6
7
8
WITH SR AS
(
SELECT DISTINCT TRUNC(DATE_STAT, 'D') AS TS
  FROM MA_TABLE
)
  SELECT TO_CHAR(TS, 'dd/mm/yyyy') AS TS
    FROM SR
ORDER BY TS ASC;
Ou alors avoir deux colonnes en sortie de requête :
Code :
1
2
3
4
  SELECT DISTINCT TO_CHAR(DATE_STAT, 'DD/MM/YYYY') AS TS,
         TRUNC(DATE_STAT, 'D') AS TS_DT
    FROM MA_TABLE
ORDER BY TS_DT ASC;
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 16h01   #5
Futur Membre du Club
 
Inscription : février 2007
Messages : 56
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 56
Points : 17
Points : 17
Merci beaucoup à tous les deux je vais essayer les solutions que vous proposez et basculerai ce sujet résolu le cas échéant.

Je vais réellement devoir me pencher sur cette fonction trunc, c'est la deuxième fois qu'elle répond à un de mes besoins
madmaxou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2011, 10h19   #6
Futur Membre du Club
 
Inscription : février 2007
Messages : 56
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 56
Points : 17
Points : 17
J'ai mis un peu de temps à répondre, la solution suggérée est toutefois parfaitement fonctionnelle, je l'ai modifiée à ma sauce, comme suit, pour n'obtenir que les dates au format jour/mois/année:

Code :
1
2
3
SELECT to_char(TRUNC(DATE_STAT, 'DD'), 'DD/MM/YYYY') AS TS FROM MA_TABLE
     GROUP BY TRUNC(DATE_STAT, 'DD')
  ORDER BY TRUNC(DATE_STAT, 'DD') ASC
Merci encore
madmaxou est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h01.


 
 
 
 
Partenaires

Hébergement Web