Résultats des 6 derniers mois

Résultats des 6 derniers mois - SQL/NoSQL - Programmation

Marsh Posté le 02-04-2024 à 11:53:30    

Bonjour à tous,
 
J'ai un souci avec une condition pour afficher les résultats des 6 derniers mois.
Tout fonctionnait bien l'année dernière, mais depuis que nous sommes passés en 2024, cela ne va plus.
Je cherche donc à afficher les résultats des 6 derniers mois. Nous sommes en avril, il faut donc afficher les résultats de octobre 2023 à mars 2024.
Voici mon code:

Code :
  1. LEFT JOIN leads_liste l1 ON membres_liste.id_membre = l1.auteur
  2.   AND MONTH(l1.date) BETWEEN MONTH(CURRENT_DATE - INTERVAL 6 MONTH) AND MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
  3.   AND YEAR(l1.date) BETWEEN YEAR(CURRENT_DATE - INTERVAL 6 MONTH) AND YEAR(CURRENT_DATE - INTERVAL 1 MONTH)


 
Pouvez-vous m'aider?
 
Merci d'avance!

Reply

Marsh Posté le 02-04-2024 à 11:53:30   

Reply

Marsh Posté le 02-04-2024 à 12:07:37    

bingojm a écrit :

Bonjour à tous,
 
J'ai un souci avec une condition pour afficher les résultats des 6 derniers mois.
Tout fonctionnait bien l'année dernière, mais depuis que nous sommes passés en 2024, cela ne va plus.
Je cherche donc à afficher les résultats des 6 derniers mois. Nous sommes en avril, il faut donc afficher les résultats de octobre 2023 à mars 2024.
Voici mon code:

Code :
  1. LEFT JOIN leads_liste l1 ON membres_liste.id_membre = l1.auteur
  2.   AND MONTH(l1.date) BETWEEN MONTH(CURRENT_DATE - INTERVAL 6 MONTH) AND MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
  3.   AND YEAR(l1.date) BETWEEN YEAR(CURRENT_DATE - INTERVAL 6 MONTH) AND YEAR(CURRENT_DATE - INTERVAL 1 MONTH)


 
Pouvez-vous m'aider?
 
Merci d'avance!


 
 
Bonjour,
 
Je ne suis pas expert SQL mais pour moi le "And Year..." n'est pas utile à moins de vouloir spécifier une année antérieure à 2024 au lieu de current_date et je dirais qu'il manque des parenthèses.
 
Je ferais quelque chose comme ça :
 

Code :
  1. EFT JOIN leads_liste l1 ON membres_liste.id_membre = l1.auteur
  2.   AND MONTH(l1.date) BETWEEN (MONTH(CURRENT_DATE - INTERVAL 6 MONTH) AND MONTH(CURRENT_DATE - INTERVAL 1 MONTH))


---------------
Configurations type du moment : https://forum.hardware.fr/hfr/Hardw [...] 1331_1.htm  https://www.jouannetphotographe.com
Reply

Marsh Posté le 02-04-2024 à 12:22:20    

J'avais cru comprendre qu'il fallait ajouter YEAR quand on se retrouve avec des résultats sur des années différentes.
 
Aussi, en ajoutant les parenthèses, j'ai un message d'erreur de syntaxe. Il ne les faut donc pas. En 2023, je n'ai eu aucun souci! C'est juste depuis qu'on a des résultats sur 2 années que ça pose problème. C'est pour ça que j'ai ajouté YEAR, mais cela n'est pas suffisant... Je n'ai pas de message d'erreur, mais juste aucun résultat qui s'affiche...

Reply

Marsh Posté le 03-04-2024 à 16:46:57    

Pas d'idée pourquoi cela ne fonctionne pas svp?

Reply

Marsh Posté le 03-04-2024 à 17:29:45    

Et un truc du genre :

Code :
  1. l1.date >= last_day(current_date()) + interval 1 day - interval 6 month


https://stackoverflow.com/questions [...] rent-month


---------------
D3
Reply

Marsh Posté le 03-04-2024 à 22:52:09    

Merci mais je veux récupérer les 6 derniers mois entiers avant le mois actuel. Donc pas par rapport à aujourd’hui. Vu que nous sommes en avril, il me faut donc les résultats du 1/10/2033 au 31/3/2024.  
Merci!

Reply

Marsh Posté le 04-04-2024 à 08:16:24    

Code :
  1. [...] AND  AND l1.date < last_day(current_date() - interval 1 month)  :o


C'est ptet un <=, faut ptet préciser 23:59:59, j'ai pas d’échantillon de donnée me permettant de tester.
Après tu peux aussi bidouiller dans phpmyadmin pour tester toi même ce qui va fonctionner hein...

Message cité 1 fois
Message édité par mechkurt le 04-04-2024 à 08:18:22

---------------
D3
Reply

Marsh Posté le 04-04-2024 à 20:47:01    

mechkurt a écrit :

Code :
  1. [...] AND  AND l1.date < last_day(current_date() - interval 1 month)  :o


C'est ptet un <=, faut ptet préciser 23:59:59, j'ai pas d’échantillon de donnée me permettant de tester.
Après tu peux aussi bidouiller dans phpmyadmin pour tester toi même ce qui va fonctionner hein...


 
Merci mechkurt! Je ne connaissais as last_day. Ca avance!
Voici ce que j'ai fait:

Code :
  1. AND l1.date >= last_day(current_date()) + interval 1 day - interval 7 month
  2.             AND l1.date <= last_day(current_date() - interval 1 month)


Cela fonctionne bien, sauf qu'effectivement il ne prend pas les enregistrements du 31/3/2024.
Ca irait en ajoutant  23:59:59? mais peux-tu me dire comment? Mes tentatives ne sont pas correctes...
Merci d'avance

Reply

Marsh Posté le 04-04-2024 à 23:49:03    

https://sqlfiddle.com/mysql/online- [...] 51ebcdc124

Code :
  1. SET
  2. @debut = last_day(current_date() - interval 7 month) + interval 1 day,
  3. @fin = last_day(current_date() - interval 1 month) + interval 1 day;
  4. CREATE TABLE `test` (
  5.   `id` int(11) NOT NULL,
  6.   `date` timestamp NOT NULL,
  7.   `commentaire` varchar(10) NOT NULL
  8. );
  9. ALTER TABLE `test`
  10.   ADD PRIMARY KEY (`id`),
  11.   ADD KEY `date` (`date`);
  12. INSERT INTO `test`(`id`, `date`, `commentaire`) VALUES
  13. ('1', '2023-09-30 01:23:45', 'trop tôt'),
  14. ('2', '2023-10-01 01:23:45', 'ok'),
  15. ('3', '2023-11-11 01:23:45', 'ok'),
  16. ('4', '2023-12-12 01:23:45', 'ok'),
  17. ('5', '2024-01-01 01:23:45', 'ok'),
  18. ('6', '2024-02-02 01:23:45', 'ok'),
  19. ('7', '2024-03-31 01:23:45', 'ok'),
  20. ('8', '2024-04-01 01:23:45', 'trop tard');
  21. SELECT @debut, @fin;
  22. SELECT * FROM `test` WHERE `date` >= @debut AND `date` < @fin;


Ce serait probablement plus performant si tu avais un champ date au lieu de datetime ou timestamp, mais c'est le type de champ que tu dois avoir si il te manque le dernier jour car en faisant une comparaison avec un date convertit en datetime tu  te retrouves avec 00:00:00, ce qui n'est pas gênant pour la borne de début mais ce qui oblige d'avoir un < et le premier jour du mois d'après pour la borne de fin.
https://stackoverflow.com/questions [...] -inclusive


---------------
D3
Reply

Marsh Posté le 08-04-2024 à 11:37:04    

Merci beaucoup. J'y suis arrivé.
Pour ceux que ça intéresse:

Code :
  1. AND l1.date >= DATE_FORMAT(NOW() - INTERVAL 6 MONTH, '%Y-%m-01 00:00:00') -- Premier jour du mois, il y a 6 mois
  2.    AND l1.date <= DATE_FORMAT(LAST_DAY(NOW() - INTERVAL 1 MONTH), '%Y-%m-%d 23:59:59') -- Dernière seconde du dernier jour du mois précédent

Reply

Marsh Posté le 08-04-2024 à 11:37:04   

Reply

Marsh Posté le 08-04-2024 à 13:08:16    

De rien, effectivement avec DATE_FORMAT on peut force l'heure, par contre sur les stackoverflow que je t'ai link les gens déconseillent <= le dernier jour 23:59:59 et encourage plutôt a faire < du lendemain.
Pourquoi, pacque le format de temps SQL peut aussi avoir des milliseconde sous forme d'un point après les secondes.
 
Tu peux soit continuer comme tu le fait et corriger avec  '%Y-%m-%d 23:59:59.999', soit comme je te le conseillais à la base faire un < LAST_DAY(NOW() - INTERVAL 1 MONTH) + INTERVAL 1 DAY.
Après tu n'est probablement pas dans un cas ou tu as besoin de cette précision mais c'est bon à savoir...


---------------
D3
Reply

Marsh Posté le 09-04-2024 à 13:33:30    

Ah, il est donc sur Mysql apparemment :)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 09-04-2024 à 13:38:57    

bingojm a écrit :

Merci beaucoup. J'y suis arrivé.
Pour ceux que ça intéresse:

Code :
  1. AND l1.date >= DATE_FORMAT(NOW() - INTERVAL 6 MONTH, '%Y-%m-01 00:00:00') -- Premier jour du mois, il y a 6 mois
  2.    AND l1.date <= DATE_FORMAT(LAST_DAY(NOW() - INTERVAL 1 MONTH), '%Y-%m-%d 23:59:59') -- Dernière seconde du dernier jour du mois précédent



Pourquoi tu formaterais pas plutôt ton champ "date" vu que les heures ne t'intéressent pas ??
 

Code :
  1. AND DATE_FORMAT(l1.date, '%Y-%m-01') BETWEEN DATE_SUB(now(), INTERVAL 6 MONTH) AND LAST_DAY(NOW() - INTERVAL 1 MONTH)


Message édité par rufo le 09-04-2024 à 13:39:12

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed