Bonjour,
Je n'ai pas forcément compris le lien entre ta demande (temps écoulé par JOUR, MOIS, ...) et la requête intermédiaire que tu souhaites obtenir.
Je vais donc essayer de répondre selon deux approches.
Approche 1 : pour obtenir ton résultat intermédiaire.
Pour "ajouter" des lignes comme tu dis. Tu dois passer par une table "Calendrier" contenant l'ensemble des jours de la période. Une telle table est toujours utile à avoir dans sa BDD.
La requête peut ensuite s'écrire ainsi :
1 2 3 4 5 6 7 8 9
| select timestamp(greatest(sc.datetime, t.datetime_deb)), timestamp(least(t.datetime_fin, date_add(sc.datetime, INTERVAL 24*3600-1 SECOND))) date_fin
from
( select st1.datetime datetime_deb, st2.datetime datetime_fin
from s_table st1
join s_table st2
where st2.datetime = (select max(datetime) from s_table where smt_tmp.datetime > st1.datetime and valeur = 0)
and st1.valeur = 1
) as t
join s_calendar sc on DATE(sc.datetime) between DATE(t.datetime_deb) and DATE(t.datetime_fin) |
Il y a certainement moyen de faire mieux pour la sous-requete de la table t qui permet de rapprocher le début de période ou la valeur est 1 et la fin de la période. L'objectif ici était juste de te montrer comment on peut utiliser une table calendrier dans ton cas.
Approche 2 : en calculant directement la différence
La seconde approche serait de calculer directement la différence comme tu le fais plus ou moins dans ta requête.
La encore tout est dans le rapprochement.
1 2 3 4 5
| select TIMESTAMPDIFF(SECOND, st1.datetime, st2.datetime), TIMESTAMPDIFF(DAY, st1.datetime, st2.datetime)
from s_table st1
join s_table st2
where st2.datetime = (select max(datetime) from smt_tmp where smt_tmp.datetime > st1.datetime and valeur = 0)
and st1.valeur = 1 |
Tu peux améliorer le rapprochement en numérotant les lignes dans ta table source (si il y a une alternance de 1 et 0 chronologiquement).
Ainsi tu pourras simplement faire
1 2 3 4
| select TIMESTAMPDIFF(SECOND, st1.datetime, st2.datetime), TIMESTAMPDIFF(DAY, st1.datetime, st2.datetime)
from s_table st1
join s_table st2 on st2.compteur = st1.compteur+1
where st1.valeur = 1 |
Si tu ne peux pas ajouter la numérotation dans ta table, il faut la calculer à la volée :
select datetime, valeur, @num:=@num+1 FROM s_table st1, (select @num:=0) t ORDER BY datetime
Partager