Requete sql date/durée [Résolu]

Messages postés
36
Date d'inscription
mardi 23 novembre 2010
Statut
Membre
Dernière intervention
4 avril 2013
- - Dernière réponse : 555clR
Messages postés
36
Date d'inscription
mardi 23 novembre 2010
Statut
Membre
Dernière intervention
4 avril 2013
- 21 nov. 2011 à 05:50
Bonjour !
voilà quelques jours que je réfléchis à une manière de questionner une base de données.
Dans une table d'évènements, on trouve un champ date, un champ durée(qui peut s'étendre sur plusieurs jours).
l'idée serait d'afficher les événements d'un jour particulier, sachant que la fin de certains évènements est après le début de la journée et d'autres se terminent après la fin.
Je ne vois pas comment tourner la requête.
j'avais d'abord fait comme ça :
'SELECT *
FROM events
WHERE (
(MONTH(date_debut_event)='.$numero_mois.'
OR MONTH(date_fin_event)='.$numero_mois.')
AND (YEAR(date_debut_event) = '.$annee.'
OR YEAR(date_fin_event) = '.$annee.'))
&& '.$jour_lu.' BETWEEN UNIX_TIMESTAMP(date_debut_event) AND UNIX_TIMESTAMP(date_fin_event)
ORDER BY date_debut_event';

Et puis j'ai finalement fait ça :
'SELECT *
FROM
evenements E,
evnmt_type T
WHERE
day(E.event_date_debut) = '.$this->_timstp_jr['jr'].'
&& month(E.event_date_debut) = '.$this->_timstp_jr['mois'].'
&& year(E.event_date_debut) = '.$this->_timstp_jr['an'].'
&& E.event_type = T.evnmt_type_id
ORDER BY hour(E.event_date_debut)';

mais ça ne filtre pas les résultats comme il faudrait (la sélection ne se fait qu'à partir du champ date de début d'evenement).
auriez-vous une idée? Merci d'avance de votre aide
Afficher la suite 

7 réponses

Meilleure réponse
Messages postés
219
Date d'inscription
mercredi 26 octobre 2011
Statut
Membre
Dernière intervention
22 juin 2017
8
3
Merci
Bonjour,

Je n'ai jamais travaillé avec mysql mais avec sql server.

en principe cela doit être équivalent.

Pour moi Datetime pour la date c'est bien.

dans l'expression suivante (1) le resultat est la date de début le matin à minuit.


convert(datetime,convert(varchar(2),datepart(day,date_debut)) + '/' + convert(varchar(2),datepart(month,date_debut)) + '/' + convert(varchar(4),datepart(year,date_debut)))

dans l'expression suivante (2) le résultat est la date de la fin de l'événement le matin à minuit.

convert(datetime,convert(varchar(2),datepart(day,dateadd(minute,durée,date_debut))) + '/' + convert(varchar(2),datepart(month,dateadd(minute,durée,date_debut))) + '/' + convert(varchar(4),datepart(year,dateadd(minute,durée,date_debut))))

dans l'expression suivante (3) le résultat est la date de la fin de l'événement le soir à minuit.

Tu dois donc filtrer ta table pour que
expression(1) <= jour_analysé and jour_analysé <= expression(3)

J'espère que la conversion vers mysql est simple.


Rq : suivant la configuration de mysql tu devras peut être inverser la conversion de date jour/mois/année ou année/mois/jour

Bonne soirée


Faites simple, aussi simple que possible, mais pas simpliste.
A. Einstein.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 138 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cgandco
Messages postés
219
Date d'inscription
mercredi 26 octobre 2011
Statut
Membre
Dernière intervention
22 juin 2017
8
3
Merci
Encore moi,

plus simple pour retirer les heures et les minutes :

convert(datetime,convert(varchar,date_debut,104),104)

A+


Faites simple, aussi simple que possible, mais pas simpliste.
A. Einstein.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 138 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cgandco
Messages postés
219
Date d'inscription
mercredi 26 octobre 2011
Statut
Membre
Dernière intervention
22 juin 2017
8
3
Merci
encore un ooooppppsss

je ne t'ai pas donné l'expression 3 (le résultat est la date de la fin de l'événement le soir à minuit.)

c'est dateadd(day,1,expression2)

et le dernier petit bug (j'espère)

pas expression(1) <= jour_analysé and jour_analysé <= expression(3)

mais expression(1) <= jour_analysé and jour_analysé < expression(3)

car tu ne donneras pas la date à chercher avec des heures:minutes donc tu aurais avec le = les événements de la veille aussi.

bonne soirée








Faites simple, aussi simple que possible, mais pas simpliste.
A. Einstein.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 138 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cgandco
Messages postés
219
Date d'inscription
mercredi 26 octobre 2011
Statut
Membre
Dernière intervention
22 juin 2017
8
0
Merci
Bonjour,

J'ai deux petites précisions qu'il nous manque :

1) Je suppose que ton champ Durée est un entier, mais il est en quelle unité : seconde, minute, ...

2) si la date cherchée est le 19/11/2011 à 16h20 et que ton événement se termine le 19/11/2011 à 15h00

ou

la date cherchée est le 19/11/2011 à 6h00 et que ton événement débute le 19/11/2011 à 8h00

L'événement doit'il être listé ?

Bonne journée


Faites simple, aussi simple que possible, mais pas simpliste.
A. Einstein.
Commenter la réponse de cgandco
Messages postés
36
Date d'inscription
mardi 23 novembre 2010
Statut
Membre
Dernière intervention
4 avril 2013
0
Merci
Bonjour cgandco,
pour répondre à tes questions :
1/ mon champ mysql pour la date de début est de type datetime, et mon champs pour la durée est de type varchar... et puis après récupération je transforme.
Je devrais sans doute mettre le 1er en type timestamp, et le second en secondes/mn... ce serait plus logique en effet.
2/ je me suis sans doute mal exprimée.
L'idée est d'afficher un jour, et visualiser tous les évènements qui sont dans cette journée.
par exemple :
je veux voir ce qu'il se passe le 12juillet...
Je verrais de ma base de données tous les évènements qui se déroulent le 12 (qui commencent et terminent), mais aussi tous les événements qui ont débuté avant le 12 et qui se terminent après... c'est bien là mon pb. comment calculer ça?

Merci en tous les cas de ta réponse et de ton intérêt. Bonne fin de journée

j'espère que c'est plus clair...
Commenter la réponse de 555clR
Messages postés
36
Date d'inscription
mardi 23 novembre 2010
Statut
Membre
Dernière intervention
4 avril 2013
0
Merci
oui, c'est exactement ça. Je vais tourner un peu autour ce soir mais je crois que c'est exactement ce que je cherche à faire.
je ne parvenais pas à trouver un moyen d'y arriver.
Je te remercie beaucoup.
Je reviendrais par là lorsque j'aurais qqchose d'opérationnel.
merci encore et bonne soirée également.
PS : et sinon oui pour mysql, annee/mois/jour tjs.
Commenter la réponse de 555clR
Messages postés
36
Date d'inscription
mardi 23 novembre 2010
Statut
Membre
Dernière intervention
4 avril 2013
0
Merci
J'ai mit le temps mais j'ai finit par faire :
en php pour récupérer le jour qui m'intéresse :
//affichage du jour (à 00:00:00)
if(!isset($_GET['d']) && !isset($_GET['m']) && !isset($_GET['y']))
{
// Si rien dans l'url, récupération de la date du jour
$timestamp_jour = @mktime(0, 0, 0, date('m'), date('d'), date('Y'));
}
else
{
//sinon récupération de la date envoyée ds url
$timestamp_jour = @mktime(0, 0, 0, $_GET['m'], $_GET['d'], $_GET['y']);
}

$timestamp_transfo_date = date('Y',$timestamp_jour).'-'.date('m',$timestamp_jour).'-'.date('d',$timestamp_jour);

et ma requête :
(la durée de l'évenement est enregistrée en time dans ma base de données)

SELECT *
FROM evenements E, evnmt_type T
WHERE
(date(E.event_date_debut) <= date("'.$timestamp_transfo_date.'"))
&& (date("'.$timestamp_transfo_date.'") < date(DATE_ADD(DATE_ADD(E.event_date_debut,INTERVAL E.event_duree HOUR_SECOND), INTERVAL 1 DAY)))
&& E.event_type = T.evnmt_type_id
ORDER BY day(hour(E.event_date_debut))

tout marche impec.
je suis aux anges
Je te remercie encore de ton aide précieuse cgandco: manquant cruellement de logique, je n'aurais jamais trouvé seule.
Commenter la réponse de 555clR