Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2442 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [RESOLU] Requête SQL avec traitement d'un champ date

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[RESOLU] Requête SQL avec traitement d'un champ date

n°2017131
Matisme
Posté le 16-08-2010 à 11:22:51  profilanswer
 

Bonjour à tous,  
je bloque sur une requête SQL Select, voici le contexte.
 
J'ai une table SQL "VENTES" qui liste mes ventes.
Pour chaque vente, j'ai un champ "date_vente" contenant un timestamp (choppé via la fonction time() de PHP), qui correspond au moment précis où fut passée la vente.
 
Ce que j'aimerais faire, c'est récupérer le nombre de ventes par jour distinct.
Exemple :  
combien de ventes je fais le JEUDI, sur la période des 6 derniers mois ?
ou  
combien de ventes je fais le SAMEDI, sur les 2 dernières semaines ?
 
Exemple de résultat (boucle) :  
- SAMEDI 14 Aout : 10 ventes
- SAMEDI 21 Aout : 11 ventes
- SAMEDI 28 Aout : 13 ventes  
 
Ça, clairement, je suis pas assez calé en SQL pour savoir faire.
Et le bonus : si en plus je pouvais récupérer la moyenne via la même requête, ce serait le bonheur (bien que je puisse calculer ça en PHP par la suite).
 
Voilà, quelqu'un sait-il faire ça ?
Dans tous les cas merci du temps que vous voudrez bien m'accorder.
 
a+
Baptiste


Message édité par Matisme le 16-08-2010 à 15:12:52
mood
Publicité
Posté le 16-08-2010 à 11:22:51  profilanswer
 

n°2017171
Oliiii
Posté le 16-08-2010 à 12:43:28  profilanswer
 

Tu dois d'abord trouver la fonction qui te permet d'avoir le numero absolu du jour (donc pas le jour depuis le debut de l'année mais depuis la date 0 du SGBD), tu fais un Group By la dessus.
Puis tu dois trouver la fonction qui te donnes le numero du jour de la semaine (Samedi sera probablement numero 7) et tu utilises ca dans ton Where.
 
Voila ce que ca donne en SQL Server:

Code :
  1. SELECT FLOOR(convert(float,backup_start_date)) 'DayNumber', CONVERT(datetime,FLOOR(convert(float,backup_start_date))) 'Date', COUNT(*) 'Count'
  2. FROM dbo.backupset
  3. WHERE DATEPART(dw,backup_start_date) = 7
  4. GROUP BY FLOOR(convert(float,backup_start_date))


 
Si tu veux ajouter la moyenne ca deviens un peut plus compliqué:

Code :
  1. SELECT FLOOR(convert(float,a.backup_start_date)) 'DayNumber', CONVERT(datetime,FLOOR(convert(float,a.backup_start_date))) 'Date', COUNT(*) 'count', b.avgCount
  2. FROM dbo.backupset a
  3.     JOIN (
  4.         SELECT DATEPART(dw,a.[date]) 'weekday', AVG(a.[count]) 'avgCount'
  5.         FROM (
  6.             SELECT CONVERT(datetime,FLOOR(convert(float,backup_start_date))) 'date', COUNT(*) 'count'
  7.             FROM dbo.backupset
  8.             GROUP BY FLOOR(convert(float,backup_start_date))
  9.             ) a
  10.         GROUP BY DATEPART(dw,a.[date])
  11.     ) b ON b.weekday = DATEPART(dw,a.backup_start_date)
  12. WHERE DATEPART(dw,a.backup_start_date) = 7
  13. GROUP BY FLOOR(convert(float,a.backup_start_date)), b.avgCount

n°2017204
Matisme
Posté le 16-08-2010 à 14:06:59  profilanswer
 

Salut Oliiii, merci pour ta réponse :)
Je dois pas avoir la moitié du quart de ton expérience, du coup j'ai un peu de mal à lire et à comprendre la logique de cet exemple.

 

- convert(float,backup_start_date) => à quoi correspond "backup_start_date" ? C'est le champ c'est ça ? Dans mon cas, "date_vente" ? => Pourquoi convertir "date_vente" en float ?
- 'DayNumber' c'est la variable dans laquelle je stocke (on appelle ça un alias je crois non ?) Il manque pas un AS à ce moment là ?
- Ensuite le CONVERT suivant, que fait-il ? Il retransforme en timestamp ?
- DATEPART(dw,backup_start_date) = 7 => ça correspond à Dimanche ça non ? Ou à samedi si on considère que la semaine débute le Dimanche ? Tu confirmes ? Donc en fonction du jour qui m'intéresse, je dois modifier la valeur (entre 1 pour dimanche, et 7 pour samedi) ?

 

Serait-ce abuser de te demander ce que ça donne avec le nom de ma table ("VENTES" ) et le champ "date_vente" ? Ca me rendrait la requête un peu plus lisible, je pourrais ainsi plus facilement en comprendre la logique.

 

En attendant, je me lance : ma requête (sans la moyenne), serait donc :

Code :
  1. SELECT FLOOR(convert(float,date_vente)) AS 'DayNumber', CONVERT(datetime,FLOOR(convert(float,date_vente))) AS 'Date', COUNT(*) AS 'Count'
  2. FROM "VENTES"
  3. WHERE DATEPART(dw,date_vente) = 7
  4. GROUP BY FLOOR(convert(float,date_vente))

?

 

J'ai essayé de la faire tourner dans phpMyAdmin, apparemment il y a un erreur de syntaxe.

Message cité 1 fois
Message édité par Matisme le 16-08-2010 à 14:31:50
n°2017220
jeca
Posté le 16-08-2010 à 14:57:15  profilanswer
 

Bonjour,
 
Essaie ça :
 
SELECT SUM(nb_vente) as nb_vente, DATE_FORMAT(FROM_UNIXTIME(date_vente), '%Y-%m-%d') as date_vente
FROM vente
WHERE DATE_FORMAT(FROM_UNIXTIME(date_vente), '%w') = 6
GROUP BY date_vente
 
Ensuite, tu fais la mise en forme de la date  en PHP.

n°2017224
Matisme
Posté le 16-08-2010 à 15:03:59  profilanswer
 

Salut jeca, merci, ça fonctionne impeccable :) (sauf que c'est COUNT au lieu de SUM) :)
Je vais bidouiller pour compléter la requête, en attendant merci de m'avoir fourni cette base :)

 

Bonne journée !


Message édité par Matisme le 16-08-2010 à 15:45:19
n°2017240
Oliiii
Posté le 16-08-2010 à 16:21:11  profilanswer
 

Matisme a écrit :

Salut Oliiii, merci pour ta réponse :)
Je dois pas avoir la moitié du quart de ton expérience, du coup j'ai un peu de mal à lire et à comprendre la logique de cet exemple.
 
- convert(float,backup_start_date) => à quoi correspond "backup_start_date" ? C'est le champ c'est ça ? Dans mon cas, "date_vente" ? => Pourquoi convertir "date_vente" en float ?


Convertir une date en float ca permet de la convertir en un numero: Maintenant = 40404,6566981481
40404 = jour (01/01/1900 + 40404 jours = 16/08/2010), 0.6566981481 = heures, minutes, secondes (15h45m38s).
 
FLOOR() permet d'arrondir vers le bas sans decimale, donc au final ca permet de n'avoir que le jour sans les heures, minutes, secondes.
 
Ca a l'air compliqué mais c'est extremement rapide (vue qu'une date est stockée en float en interne et un FLOOR n'est qu'une copie d'une zone memoire a une autre).

Matisme a écrit :


- 'DayNumber' c'est la variable dans laquelle je stocke (on appelle ça un alias je crois non ?) Il manque pas un AS à ce moment là ?

Le AS est facultatif, mais theoriquement il en faut un oui.

Matisme a écrit :


- Ensuite le CONVERT suivant, que fait-il ? Il retransforme en timestamp ?

Il retransforme en Date mais sans les heures, minutes, secondes.

Matisme a écrit :


- DATEPART(dw,backup_start_date) = 7 => ça correspond à Dimanche ça non ? Ou à samedi si on considère que la semaine débute le Dimanche ? Tu confirmes ? Donc en fonction du jour qui m'intéresse, je dois modifier la valeur (entre 1 pour dimanche, et 7 pour samedi) ?

C'est bien ca oui.

Matisme a écrit :


 
Serait-ce abuser de te demander ce que ça donne avec le nom de ma table ("VENTES" ) et le champ "date_vente" ? Ca me rendrait la requête un peu plus lisible, je pourrais ainsi plus facilement en comprendre la logique.
 
En attendant, je me lance : ma requête (sans la moyenne), serait donc :

Code :
  1. SELECT FLOOR(convert(float,date_vente)) AS 'DayNumber', CONVERT(datetime,FLOOR(convert(float,date_vente))) AS 'Date', COUNT(*) AS 'Count'
  2. FROM "VENTES"
  3. WHERE DATEPART(dw,date_vente) = 7
  4. GROUP BY FLOOR(convert(float,date_vente))

?
 
J'ai essayé de la faire tourner dans phpMyAdmin, apparemment il y a un erreur de syntaxe.


 
Je ne connais pas assez MySQL pour faire ce genre de query, donc j'ai fais l'equivalent en SQL Server pour te donner une idée.


Message édité par Oliiii le 16-08-2010 à 16:22:46
n°2017254
Matisme
Posté le 16-08-2010 à 16:59:42  profilanswer
 

Merci Oliii, c'est beaucoup plus clair à présent :)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [RESOLU] Requête SQL avec traitement d'un champ date

 

Sujets relatifs
[Résolu] Email HTML - Bug Affichage Dans Hotmail Gmail[RESOLU] Modifier timeout pour un mysql_query() ???
[SQL Server] Job et espace dans le nom de la BDD[résolu] Implémentation des lecteurs/écrivains
[résolu]Tester l'égalité entre 2 float (incompréhensible...)[RESOLU]Stocker le résultat d'une requête dans un tableau
récupere une date string et l'attribuer à CalendarProblème de requête sql
[RESOLU] Remplacement d'une chaine de caractères dans un fichier html 
Plus de sujets relatifs à : [RESOLU] Requête SQL avec traitement d'un champ date


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR