IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Requête pour chercher une indisponibilité [MariaDB]


Sujet :

Requêtes MySQL

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 191
    Points : 595
    Points
    595
    Par défaut Requête pour chercher une indisponibilité
    Bonsoir,
    j'essaye de trouver la bonne requête, le but est de faire un calendrier
    voici la requête et la table:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    +------------+-----------+-----------------+----------------+-------------+--------------+----------------+--------------+------------+
    | idReserver | demandeur | reserverAvecQui | reserverWhy    | saisieQuant | reserverDate | reserverStartH | reserverEndH | reserverOk |
    +------------+-----------+-----------------+----------------+-------------+--------------+----------------+--------------+------------+
    |     1 | toto              | anonyme         | Je ne sais pas |  1524167863 |   1524175200 |     1524222000 |   1524240000 |       NULL |
    +------------+-----------+-----------------+----------------+-------------+--------------+----------------+--------------+------------+
    1 row in set (0.00 sec)
     
     select * from calendar WHERE  1524175200 <= reserverStartH AND 1524236400 >= reserverEndH;
    1524175200 = 20/04 à 0:00
    1524236400 = 20/04 à 17H

    mon but est de trouver dans la table si j'ai déjà prix un rendez-vous,
    si la plage est déjà pris, je dois obtenir un résultat afin de d'afficher qui à déjà pris le RDV.

    si j'ai pas de résultat, c'est que je peux insérer un tuple en plus pour un autre RDV.

    dans la base j'ai prix un RDV le 20/04 de 13H à 18H00
    la requête me donne rien, or je m'attends avoir un résultat
    comment je dois faire ma requête ?
    merci de vos réponse

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Bonjour,
    Deux périodes [DtDeb1,DtFin1] et [DtDeb2,DtFin2] sont chevauchantes si
    DtDeb2=<DtFin1 et DtFin2>=DtDeb1

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 191
    Points : 595
    Points
    595
    Par défaut
    merci de ta réponse, j'ai fait un dessin car ça se crois et ce n'est pas évident pour moi ... ça me mélange les pédale ..
    Nom : chevauche.png
Affichages : 130
Taille : 9,7 Ko

    ce qui me donne en requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select * from calendar WHERE reserverStartH =< 1524236400 AND reserverEndH >= 1524175200 ;
    cela me fait une erreur de syntaxe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '< 1524236400 AND reserverEndH >= 1524175200' at line 1
    je pense qu'il ne doit pas aimer le "=" sinon la requête fonctionne sans le égale ...

  4. #4
    Membre expérimenté

    Homme Profil pro
    linux, pascal, HTML
    Inscrit en
    Mars 2002
    Messages
    649
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : linux, pascal, HTML
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2002
    Messages : 649
    Points : 1 493
    Points
    1 493
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Pour moi ,dans =< C'est l'ordre qui n'est pas bon


    Elément Description
    > Plus grand que
    >= Plus grand ou égal à
    < Plus petit que
    <= Plus petit ou égal à
    = Égal à
    <> Différent de

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Je ne sais pas si MariaDB supporte la fonction OVERLAPS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select *
      from calendar
     where (1524236400, 1524175200) overlaps (reserverStartH, reserverEndH);
    Sinon regardez le cours de SQLPro sur la gestion du temps pour le traduire avec des < > AND et OR :
    https://sqlpro.developpez.com/cours/...ntemps/#L1.2.2

  6. #6
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut keokaz.

    Pourquoi utilisez-vous les dates au format Unix ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    --------------
    select FROM_UNIXTIME(1524175200)
    --------------
     
    +---------------------------+
    | FROM_UNIXTIME(1524175200) |
    +---------------------------+
    | 2018-04-20 00:00:00       |
    +---------------------------+
    --------------
    select FROM_UNIXTIME(1524236400)
    --------------
     
    +---------------------------+
    | FROM_UNIXTIME(1524236400) |
    +---------------------------+
    | 2018-04-20 17:00:00       |
    +---------------------------+
    Le mieux est de les convertir dans le type date, cela sera plus simple pour les gérer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from calendar WHERE  1524175200 <= reserverStartH AND 1524236400 >= reserverEndH;
    Vous y étiez presque !

    Citation Envoyé par Escartefigue
    Bonjour,
    Deux périodes [DtDeb1,DtFin1] et [DtDeb2,DtFin2] sont chevauchantes si
    DtDeb2=<DtFin1 et DtFin2>=DtDeb1
    Vous aussi, vous y étiez presque. Les conditions doivent être strictes !

    La bonne écriture est : "DtDeb2 < DtFin1 et DtFin2 > DtDeb1[".

    Citation Envoyé par keokaz
    dans la base j'ai prix un RDV le 20/04 de 13H à 18H00
    Voici ce que cela donne sur un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
        DEFAULT CHARACTER SET `latin1`
        DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    CREATE TABLE `test`
    ( `id`            integer unsigned  NOT NULL auto_increment PRIMARY KEY,
      `datedeb`       datetime      NOT NULL,
      `datefin`       datetime      NOT NULL,
      `reservation`   varchar(255)  NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `test` (`datedeb`,`datefin`,`reservation`) values
      ('2018-04-20 00:00:00','2018-04-20 08:00:00','Réservation 1'),
      ('2018-04-20 12:00:00','2018-04-20 14:00:00','Réservation 2'),
      ('2018-04-20 18:00:00','2018-04-21 00:00:00','Réservation 3')
    --------------
     
    --------------
    select * from `test` order by datedeb
    --------------
     
    +----+---------------------+---------------------+---------------+
    | id | datedeb             | datefin             | reservation   |
    +----+---------------------+---------------------+---------------+
    |  1 | 2018-04-20 00:00:00 | 2018-04-20 08:00:00 | Réservation 1 |
    |  2 | 2018-04-20 12:00:00 | 2018-04-20 14:00:00 | Réservation 2 |
    |  3 | 2018-04-20 18:00:00 | 2018-04-21 00:00:00 | Réservation 3 |
    +----+---------------------+---------------------+---------------+
    --------------
    insert into `test` (`datedeb`,`datefin`,`reservation`)
      select            *
                  from  (  select  '2018-04-20 08:00:00' as datedeb,
                                   '2018-04-20 12:00:00' as datefin,
                                   'Réservation A !'    as reservatin
                             from  dual
                            union
                           select  '2018-04-20 14:00:00' as datedeb,
                                   '2018-04-20 19:00:00' as datefin,
                                   'Réservation B !'    as reservatin
                             from  dual
                        ) as x
      where not exists  (  select  1
                             from  `test` as t
                            where  t.datedeb < x.datefin
                              and  t.datefin > x.datedeb
                        )
    --------------
     
    --------------
    select * from `test`
    order by datedeb
    --------------
     
    +----+---------------------+---------------------+-----------------+
    | id | datedeb             | datefin             | reservation     |
    +----+---------------------+---------------------+-----------------+
    |  1 | 2018-04-20 00:00:00 | 2018-04-20 08:00:00 | Réservation 1   |
    |  4 | 2018-04-20 08:00:00 | 2018-04-20 12:00:00 | Réservation A ! |
    |  2 | 2018-04-20 12:00:00 | 2018-04-20 14:00:00 | Réservation 2   |
    |  3 | 2018-04-20 18:00:00 | 2018-04-21 00:00:00 | Réservation 3   |
    +----+---------------------+---------------------+-----------------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
    Appuyez sur une touche pour continuer...
    La "réservation A" ne chevauchant aucune autre réservation est acceptée.
    Tandis que la réservation B chevauche la réservation 3, ne sera pas acceptée.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  7. #7
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 191
    Points : 595
    Points
    595
    Par défaut
    Pourquoi utilisez-vous les dates au format Unix ?

    Merci pour ces réponses

    C'est peut être un tort, mais si j'utilise des dates, j'aurai des problème à utiliser les objets date, car entre les problèmes de d'horaire de décalage, de teste si c'est une année bissextile, les date au format français ou américain, des timestamps pour le langage en microseconde serveur, PHP des timestamps en milliseconde pour le client javascript,Ou bien vérifier que la date est écrite correctement avec des regex ... on s'en sort plus.

    je préfère travaillé avec des timestamps, comme ça il n'y aura pas à gérer ces dates pour développer une gestion de rendez-vous, un nombre entier sera compréhensible par tous type de system.
    Pour faire des calculs c'est plus simple.

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    Vous aussi, vous y étiez presque. Les conditions doivent être strictes !

    La bonne écriture est : "DtDeb2 < DtFin1 et DtFin2 > DtDeb1[".
    Faux !
    Si la période 1 va du 01-01-2018 au 31-01-2018 et la période 2 va du 31-01-2018 au 28-02-2018 alors ces deux périodes sont chevauchantes car la date du 31-01-2018 est commune aux deux périodes.
    La formule pour vérifier un chevauchement est donc bien celle que j'ai fournie, les bornes doivent être incluses.

  9. #9
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut Escartefigue.

    Dans l'exemple indiqué par keokaz, la période indiqué contient la date et l'heure.
    Si je prends comme exemple la période suivante, elle s'écrira ainsi :
    Début : 2018-04-20 12:00:00 --- Fin : 2018-04-21 12:00:00
    au lieu de cette écriture :
    Début : 2018-04-20 12:00:00 --- Fin : 2018-04-21 11:59:59.
    Pourquoi ? Parce que par convention, on écrit 12:00:00 et non 11:59:59 pour indiquer une période de fin.

    Si l'on ne tient compte que de la date, je suis d'accord, mais pas si l'on introduit l'heure.

    Pourquoi en utilisant votre règle, l'exemple de keokaz ne fonctionne pas ?

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  10. #10
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Par ce que dans ma réponse n°2 du 20 avril j'ai donné non pas une requête SQL qui s'appuie sur un type de colonne (date seulement ou dateheure), mais une règle de gestion, et cette règle reste vraie quelque soit le type de colonne.
    C'est la raison pour laquelle je n'ai pas entouré ma réponse de balises "code"
    Dans tous les cas, pour tester un chevauchement qu'il y ait des heures ou pas, il faut prendre les bornes incluses

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 14/06/2016, 12h11
  2. requête pour chercher dans formulaire
    Par Transfusion dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 28/02/2007, 16h31
  3. [VB6]créer une requete pour chercher une partie d'un mot
    Par aibar dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 11/06/2006, 21h38
  4. Requête pour faire une addition sur autres requêtes
    Par guenfood dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 06/06/2006, 18h35
  5. Réponses: 2
    Dernier message: 28/10/2005, 12h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo