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 :

Problème avec des dates dans une requête


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 34
    Points : 32
    Points
    32
    Par défaut Problème avec des dates dans une requête
    Bonjour amis informaticien (:

    Voilà mon problème j'ai une requête qui s'éffectue très bien sans le BETWEEN pour la date.
    Donc je sais qu'avant il n'y a pas de problème et j'ai essayer 15000 modif pour trouver l’erreur, toujours sans succès...

    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
        Private Sub Calcul_Click(sender As System.Object, e As System.EventArgs) Handles Calcul.Click
            Dim date_select As String = Cb_solde.Text
            Dim temps_total As Double = 1
            Dim entitez As String
            Dim date_actu As Date
            TextBox1.Text = ""
            date_actu = DateTime.Now.Date.ToString("yyyy-MM-dd")
            entitez = CStr(CType(Cbbox_choientite.SelectedItem, ListItem).Value)
            If Not date_select = "" Then
                Dim resultSQL9 As DataView = Remplir_entite_BDD(
                    "SELECT COALESCE(SUM(TT.actiontime / 60), 0) AS temp_total " & _
                    "FROM glpi_tickettasks AS TT " & _
                    "INNER JOIN glpi_tickets AS T ON T.id = TT.tickets_id " & _
                    "WHERE T.entities_id = '" & entitez & "' " & _
                    "AND T.date BETWEEN '" & date_select & "' AND '" & date_actu & "' ")
                For Each rst4 As DataRowView In resultSQL9
                    temps_total = rst4("temp_total")
                Next
                TextBox1.Text = temps_total
            Else
                Exit Sub
            End If
     
        End Sub
    Voilà le résultat de la requête :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    "SELECT COALESCE(SUM(TT.actiontime / 60), 0) AS temp_total 
    FROM glpi_tickettasks AS TT 
    INNER JOIN glpi_tickets AS T ON T.id = TT.tickets_id 
    WHERE T.entities_id = '54' 
    AND T.date 
    BETWEEN '01/10/2015' AND '15/06/2016'"
    Avec le COALESCE qui dit que par défaut la valeur sera 0. Si j'enlève le COALESCE, j'ai une erreur avec ceci "La conversion du type 'DBNull' en type 'Double' n'est pas valide."

    Après mainte réflexion je n'y arrive toujours pas... J'ai une piste, c'est que dans ma BDD les dates sont en format 2016-06-15, mais j'ai pourtant bien déclarer mes variables en "yyyy-MM-dd"... Mais on peut voir que ça ne sort pas comme je veux, comment obliger la conversion ou avez-vous vu une autre érreur?

    Help pls (:

    Edit : Après avoir essayer ceci :"AND T.date BETWEEN DATE_FORMAT('" & date_select & "', '%Y-%m-%d') AND DATE_FORMAT('" & date_actu & "', '%Y-%m-%d') ")
    J'ai toujours la même erreur, je pense donc que ce n'est pas le format de la date, mais la syntaxe du WHERE ou du BETWEEN

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 093
    Points : 28 378
    Points
    28 378
    Par défaut
    Une date doit être stockée dans une colonne de type DATE.
    Le type DATE n'a pas de format.
    Il faut donc impérativement convertir les dates (sous forme de chaines de caractères) en type DATE pour pouvoir les comparer avec une colonne de type DATE.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 34
    Points : 32
    Points
    32
    Par défaut
    Mais du coup j'ai essayer ça dans ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "AND T.date BETWEEN DATE_FORMAT('" & date_select & "', '%Y-%m-%d') AND DATE_FORMAT('" & date_actu & "', '%Y-%m-%d') "
    Toujours aucun succès...

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 093
    Points : 28 378
    Points
    28 378
    Par défaut
    La fonction DATE_FORMAT retourne une chaine de caractères, pas une date.
    C'est la fonction inverse qu'il te faut, celle qui convertit une chaine en date.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    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 393
    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 393
    Points : 19 139
    Points
    19 139
    Par défaut
    Salut thomaso38.

    Il y a plusieurs choses qui ne vont pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT COALESCE(SUM(TT.actiontime / 60), 0) AS temp_total 
    FROM glpi_tickettasks AS TT 
    INNER JOIN glpi_tickets AS T
    ON T.id = TT.tickets_id 
    WHERE T.entities_id = '54' 
    AND   T.date BETWEEN '01/10/2015' AND '15/06/2016'
    1) ne mettez pas un alias qui pourrait porter une confusion !
    Pour la première table, mettez "as tb1" et pour la seconde table "as tb2".
    C'est juste un détail mais qui a son importance.

    2) le format de vos dates dans la clause between n'est pas conforme.
    Il faut mettre : "AND T.date BETWEEN '2015-10-01' AND '2016-06-15'"

    3) vous faites une sommes sur la colonne "actiontime" puis ensuite, vous vérifiez si la somme est null ou pas.
    Vous devez inverser les deux fonctions : "SELECT SUM(COALESCE(TT.actiontime / 60), 0) AS temp_total".

    4) Quel est le format du résultat de "temp_total" ?
    Faites attention à la conversion impliciste qui peut vous faire perdre des informations, entre autre ici la partir décimale.
    Le mieux est de faire ceci : "SELECT SUM(COALESCE(cast(TT.actiontime as decimal(15,2)) / 60.0), 0) AS temp_total".

    5) ne confonder pas le stockage de l'information et sa représentation (format).
    Le format d'une date est : "YYYY-MM-DD". Son stockage se fait en utilisant le type "date".

    Modifiez vos colonnes, qui comme je le suppose est dans le type "varchar(255)", en remplaçant par le type "date".
    Comment faire ?
    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
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    --------------
    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 IF NOT EXISTS test
    ( `id`   integer unsigned not null auto_increment primary key,
      `date` varchar(255)     not null
    ) engine=innoDB
      default charset=latin1 collate=latin1_general_ci
      row_format=compressed
    --------------
     
    --------------
    insert into `test` (`date`) values
      ('2015-12-31'), ('2015-10-13')
    --------------
     
    --------------
    select * from test
    --------------
     
    +----+------------+
    | id | date       |
    +----+------------+
    |  1 | 2015-12-31 |
    |  2 | 2015-10-13 |
    +----+------------+
    --------------
    describe `test`
    --------------
     
    +-------+------------------+------+-----+---------+----------------+
    | Field | Type             | Null | Key | Default | Extra          |
    +-------+------------------+------+-----+---------+----------------+
    | id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
    | date  | varchar(255)     | NO   |     | NULL    |                |
    +-------+------------------+------+-----+---------+----------------+
    --------------
    alter table `test` add column `datebis` date not null
    --------------
     
    --------------
    describe `test`
    --------------
     
    +---------+------------------+------+-----+---------+----------------+
    | Field   | Type             | Null | Key | Default | Extra          |
    +---------+------------------+------+-----+---------+----------------+
    | id      | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
    | date    | varchar(255)     | NO   |     | NULL    |                |
    | datebis | date             | NO   |     | NULL    |                |
    +---------+------------------+------+-----+---------+----------------+
    --------------
    update `test` set datebis = date
    --------------
     
    --------------
    select * from test
    --------------
     
    +----+------------+------------+
    | id | date       | datebis    |
    +----+------------+------------+
    |  1 | 2015-12-31 | 2015-12-31 |
    |  2 | 2015-10-13 | 2015-10-13 |
    +----+------------+------------+
    --------------
    alter table `test` drop column date
    --------------
     
    --------------
    alter table `test` change `datebis` `date` date not null
    --------------
     
    --------------
    describe `test`
    --------------
     
    +-------+------------------+------+-----+---------+----------------+
    | Field | Type             | Null | Key | Default | Extra          |
    +-------+------------------+------+-----+---------+----------------+
    | id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
    | date  | date             | NO   |     | NULL    |                |
    +-------+------------------+------+-----+---------+----------------+
    --------------
    select * from test
    --------------
     
    +----+------------+
    | id | date       |
    +----+------------+
    |  1 | 2015-12-31 |
    |  2 | 2015-10-13 |
    +----+------------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
    Appuyez sur une touche pour continuer...
    Avant de faire la manipulation, faites une sauvegarde de cette table.

    Normalement, en changeant le type de votre colonne date, votre problème sera résolu !

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

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 34
    Points : 32
    Points
    32
    Par défaut
    Déjà vous savez ce que ça fait de débloquer un problème !!

    Je vous remercie énormément ! Vos deux conseil mon très bien mis sur la voie !
    Artemus24 et al1 24, en fait vous m'avez donner la réponse !

    al1 24, du coup j'ai fais ce que vous m'aviez dit mais plus haut, dans la fonction qui rentre les dates que j'ai le choix de sélectionnées, j'ai changer le format de ma date bien plus haut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            Dim resultSQL9 As DataView
            entiter = CStr(CType(Cbbox_choientite.SelectedItem, ListItem).Value)
            resultSQL9 = Remplir_entite_BDD("SELECT DATE_FORMAT(CAST( Date AS DATE), '%Y-%m-%d') AS Date_combo FROM cheque_intervention_solde WHERE ID_entite = " & entiter & " ORDER BY Date DESC")
            If resultSQL9.Count > 0 Then
                For Each rst As DataRowView In resultSQL9
                    Cb_solde.Items.Add(rst("Date_combo"))
                Next
            End If
    Du coup ça me retourne une date dans le bon format ! et grâce à tous les conseils que tu m'as donner Artemus24, j'ai fait ceci (J'ai enlevé le COALESC qui me retourner une erreur de syntaxe) :

    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
        Private Sub Calcul_Click(sender As System.Object, e As System.EventArgs) Handles Calcul.Click
            Dim date_select As String = Cb_solde.Text
            Dim temps_total As Integer = 0
            Dim dateString As String = Nothing
            Dim entitez As String
            Dim date_actu As String
            TextBox1.Text = ""
            date_actu = DateTime.Now.Date.ToString("yyyy-MM-dd")
     
            entitez = CStr(CType(Cbbox_choientite.SelectedItem, ListItem).Value)
            If Not date_select.ToString = "" Then
                Dim resultSQL9 As DataView = Remplir_entite_BDD(
                    "SELECT SUM(cast(tb1.actiontime as decimal(15,2)) / 60.0) AS temp_total, tb1.date " & _
                    "FROM glpi_tickettasks AS tb1 " & _
                    "INNER JOIN glpi_tickets AS tb2 ON tb2.id = tb1.tickets_id " & _
                    "WHERE tb2.entities_id = '" & entitez & "' " & _
                    "AND tb1.date BETWEEN '" & date_select & "' AND '" & date_actu & "'")
                For Each rst4 As DataRowView In resultSQL9
                    temps_total = rst4("temp_total")
                Next
                TextBox1.Text = temps_total
            Else
                Exit Sub
            End If
     
        End Sub
    Du coup j'ai changer le temps_total de string a integer, pour enlever les chiffre après la virgule (je n'en ai pas besoin dans mon cas).
    Par contre je vais peut être vous décevoir, mais le fait de déclarées les variables en DATE me bloquer sur pas mal de points. Du coup je les aient mis en string et ça ne m'a poser aucun problème ! Au contraire quand je passer par un type 'DATE' j'avais ce type de format ("DD/MM/YYYY") et je cherchais ceci : ("YYYY-MM-DD"). Le type string m'a facilité la conversion (:

    Je vous remercie encore pour votre aide ! Pouce bleu, et sujet résolu !

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

Discussions similaires

  1. problème avec l'apostrophe dans une requête
    Par mika0102 dans le forum VBA Access
    Réponses: 7
    Dernier message: 09/03/2019, 16h51
  2. Changer le format des dates dans une requête SQL
    Par Tazze-99 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 23/07/2012, 15h09
  3. Problème avec des guillemets dans une requête
    Par clairetj dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/04/2011, 11h39
  4. Problème avec un update dans une requête
    Par cracozore dans le forum Langage SQL
    Réponses: 8
    Dernier message: 15/08/2008, 13h45
  5. problème classement de date dans une requête
    Par heteroclite dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 15/10/2006, 15h55

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