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 :

Somme des heures avec amplitude [MySQL-5.6]


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Employé
    Inscrit en
    Octobre 2013
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Employé
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2013
    Messages : 51
    Par défaut Somme des heures avec amplitude
    Bonjour à toutes et tous

    Sous Mysql, je dispose d'une table dans laquelle, entre autres, j'ai un champs "heure_debut" et un autre "heure_fin".
    J'y renseigne les données correspondantes, à savoir par exemple : 06h00-0830 puis 10h45-11h25 etc... et ce pour chaque jour.

    Pour le moment, j'ai pu construire une requete qui m'additionne les temps et m'affiche le total. dans l'exemple ci-dessus, 2h30 + 40mn.

    Ce que j'aimerais en plus, c'est avoir une requete qui me calcule l'amplitude à savoir le temps écoulé entre la première heure, ici 6h00 et la dernière, ici 11h25.
    Et là.....je ne sais pas faire.

    D'où ma demande d'aide

    Cordialement à vous

    Eric Eychenne

  2. #2
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 883
    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 883
    Par défaut
    Salut eeychenne.

    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
    --------------
    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,
      `date_jour`     date             NOT NULL,
      `heure_debut`   time             NOT NULL,
      `heure_fin`     time             NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `test` (`date_jour`, `heure_debut`,`heure_fin`) VALUES
      ('2016-05-04', '06:00:00', '08:30:00'),
      ('2016-05-04', '10:45:00', '11:25:00')
    --------------
     
    --------------
    select * from test
    --------------
     
    +----+------------+-------------+-----------+
    | id | date_jour  | heure_debut | heure_fin |
    +----+------------+-------------+-----------+
    |  1 | 2016-05-04 | 06:00:00    | 08:30:00  |
    |  2 | 2016-05-04 | 10:45:00    | 11:25:00  |
    +----+------------+-------------+-----------+
    --------------
    select date_jour,
           timediff(max(heure_fin), min(heure_debut))                      as amplitude,
           sec_to_time(sum(time_to_sec(timediff(heure_fin, heure_debut)))) as total
    from test
    group by date_jour
    --------------
     
    +------------+-----------+----------+
    | date_jour  | amplitude | total    |
    +------------+-----------+----------+
    | 2016-05-04 | 05:25:00  | 03:10:00 |
    +------------+-----------+----------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    @+

  3. #3
    Membre averti
    Homme Profil pro
    Employé
    Inscrit en
    Octobre 2013
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Employé
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2013
    Messages : 51
    Par défaut Merci
    Je vais tester dès que j'aurai une minute.
    Toujours est-il que je vous remercie de la rapidité de la réponse.

    Bien à vous

    Eric Eychenne

  4. #4
    Membre averti
    Homme Profil pro
    Employé
    Inscrit en
    Octobre 2013
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Employé
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2013
    Messages : 51
    Par défaut Je vais abuser
    Bonjour,

    Pour un jour J, no pb. Maintenant, comment faire pour avoir la somme des amplitudes quotidiennes pour une semaine d'un mois, et pour un mois ?

    Mille merci par avance

    Eric Eychenne

  5. #5
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 883
    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 883
    Par défaut
    Salut eeychenne.

    Pour obtenir le résultat que tu recherches, il faut d'abord extraire de la date ce que tu recherches à regrouper.
    1) pour la semaine, le format est '%v'.
    2) pour le mois, le format est "%m'.

    Tu trouves cela dans la fonction date_format : https://dev.mysql.com/doc/refman/5.5...on_date-format

    Mais avant de faire quoi que ce soit, tu dois en premier regrouper tes lignes par jour, afin de calculer l'amplitude et le total quotidien.
    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
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    --------------
    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,
      `date_jour`     date             NOT NULL,
      `heure_debut`   time             NOT NULL,
      `heure_fin`     time             NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `test` (`date_jour`, `heure_debut`,`heure_fin`) VALUES
      ('2016-05-01', '04:00:00', '11:00:00'),
      ('2016-05-01', '15:00:00', '18:00:00'),
      ('2016-05-02', '04:00:00', '11:00:00'),
      ('2016-05-02', '15:00:00', '18:00:00'),
      ('2016-05-03', '04:00:00', '11:00:00'),
      ('2016-05-02', '15:00:00', '18:00:00'),
      ('2016-05-04', '06:00:00', '08:30:00'),
      ('2016-05-04', '10:45:00', '11:25:00'),
      ('2016-05-05', '04:00:00', '11:00:00'),
      ('2016-05-05', '15:00:00', '18:00:00'),
      ('2016-05-06', '04:00:00', '11:00:00'),
      ('2016-05-06', '15:00:00', '18:00:00'),
      ('2016-05-07', '04:00:00', '11:00:00'),
      ('2016-05-07', '15:00:00', '18:00:00'),
      ('2016-05-08', '04:00:00', '11:00:00'),
      ('2016-05-08', '15:00:00', '18:00:00'),
      ('2016-05-09', '04:00:00', '11:00:00'),
      ('2016-05-09', '15:00:00', '18:00:00'),
      ('2016-05-10', '04:00:00', '11:00:00'),
      ('2016-05-10', '15:00:00', '18:00:00'),
      ('2016-05-31', '11:00:00', '13:30:00'),
      ('2016-05-31', '15:00:00', '17:00:00')
    --------------
     
    --------------
    select * from test
    --------------
     
    +----+------------+-------------+-----------+
    | id | date_jour  | heure_debut | heure_fin |
    +----+------------+-------------+-----------+
    |  1 | 2016-05-01 | 04:00:00    | 11:00:00  |
    |  2 | 2016-05-01 | 15:00:00    | 18:00:00  |
    |  3 | 2016-05-02 | 04:00:00    | 11:00:00  |
    |  4 | 2016-05-02 | 15:00:00    | 18:00:00  |
    |  5 | 2016-05-03 | 04:00:00    | 11:00:00  |
    |  6 | 2016-05-02 | 15:00:00    | 18:00:00  |
    |  7 | 2016-05-04 | 06:00:00    | 08:30:00  |
    |  8 | 2016-05-04 | 10:45:00    | 11:25:00  |
    |  9 | 2016-05-05 | 04:00:00    | 11:00:00  |
    | 10 | 2016-05-05 | 15:00:00    | 18:00:00  |
    | 11 | 2016-05-06 | 04:00:00    | 11:00:00  |
    | 12 | 2016-05-06 | 15:00:00    | 18:00:00  |
    | 13 | 2016-05-07 | 04:00:00    | 11:00:00  |
    | 14 | 2016-05-07 | 15:00:00    | 18:00:00  |
    | 15 | 2016-05-08 | 04:00:00    | 11:00:00  |
    | 16 | 2016-05-08 | 15:00:00    | 18:00:00  |
    | 17 | 2016-05-09 | 04:00:00    | 11:00:00  |
    | 18 | 2016-05-09 | 15:00:00    | 18:00:00  |
    | 19 | 2016-05-10 | 04:00:00    | 11:00:00  |
    | 20 | 2016-05-10 | 15:00:00    | 18:00:00  |
    | 21 | 2016-05-31 | 11:00:00    | 13:30:00  |
    | 22 | 2016-05-31 | 15:00:00    | 17:00:00  |
    +----+------------+-------------+-----------+
    --------------
    select date_jour as jour,
           timediff(max(heure_fin), min(heure_debut)) as amplitude,
               sec_to_time(sum(time_to_sec(timediff(heure_fin, heure_debut)))) as total
    from test
    group by date_jour
    --------------
     
    +------------+-----------+----------+
    | jour       | amplitude | total    |
    +------------+-----------+----------+
    | 2016-05-01 | 14:00:00  | 10:00:00 |
    | 2016-05-02 | 14:00:00  | 13:00:00 |
    | 2016-05-03 | 07:00:00  | 07:00:00 |
    | 2016-05-04 | 05:25:00  | 03:10:00 |
    | 2016-05-05 | 14:00:00  | 10:00:00 |
    | 2016-05-06 | 14:00:00  | 10:00:00 |
    | 2016-05-07 | 14:00:00  | 10:00:00 |
    | 2016-05-08 | 14:00:00  | 10:00:00 |
    | 2016-05-09 | 14:00:00  | 10:00:00 |
    | 2016-05-10 | 14:00:00  | 10:00:00 |
    | 2016-05-31 | 06:00:00  | 04:30:00 |
    +------------+-----------+----------+
    --------------
    select date_format(date_jour, '%Y-%v') as semaine,
           sec_to_time(sum(time_to_sec(amplitude))) as amplitude,
           sec_to_time(sum(time_to_sec(total)))     as total
    from (
     
    select date_jour,
           timediff(      max(heure_fin),       min(heure_debut)) as amplitude,
           timediff(any_value(heure_fin), any_value(heure_debut)) as total
    from test
    group by date_jour
     
    ) as x
    group by semaine
    --------------
     
    +---------+-----------+----------+
    | semaine | amplitude | total    |
    +---------+-----------+----------+
    | 2016-17 | 14:00:00  | 07:00:00 |
    | 2016-18 | 82:25:00  | 44:30:00 |
    | 2016-19 | 28:00:00  | 14:00:00 |
    | 2016-22 | 06:00:00  | 02:30:00 |
    +---------+-----------+----------+
    --------------
    select date_format(date_jour, '%Y-%m') as mois,
           sec_to_time(sum(time_to_sec(amplitude))) as amplitude,
           sec_to_time(sum(time_to_sec(total)))     as total
    from (
     
    select date_jour,
           timediff(      max(heure_fin),       min(heure_debut)) as amplitude,
           timediff(any_value(heure_fin), any_value(heure_debut)) as total
    from test
    group by date_jour
     
    ) as x
    group by mois
    --------------
     
    +---------+-----------+----------+
    | mois    | amplitude | total    |
    +---------+-----------+----------+
    | 2016-05 | 130:25:00 | 68:00:00 |
    +---------+-----------+----------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    @+

  6. #6
    Membre averti
    Homme Profil pro
    Employé
    Inscrit en
    Octobre 2013
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Employé
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2013
    Messages : 51
    Par défaut Yep
    Bonjour et merci tout plein.
    A moi de bosser maintenant avec ces précieuses informations.

    Très cordialement

    Eric Eychenne

  7. #7
    Membre averti
    Homme Profil pro
    Employé
    Inscrit en
    Octobre 2013
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Employé
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2013
    Messages : 51
    Par défaut ben..
    Bonjour

    Je dois être trop je ne sais quoi mais...

    Il n'y a pas moyen avec une seule requete, d'obtenir le résultat voulu ? Parce que avec php et mysql, je ne vois pas bien comment faire.
    Genre, je fais Une requete demandant la somme des amplitudes quotidiennes sur une semaine donnée.

    Ce n'est pas envisageable ?

    Bien à vous

    Eric Eychenne

  8. #8
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 883
    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 883
    Par défaut
    Salut eeychenne.

    Citation Envoyé par eeychenne
    Il n'y a pas moyen avec une seule requête, d'obtenir le résultat voulu ?
    Je ne comprends pas bien ta question.

    Est-ce que tu veux regrouper en une seule requête, la requête par "semaine" et la requête par "mois ?
    Si c'est cela, il suffit de faire un "union", comme dans l'exemple ci-aprè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
    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
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    --------------
    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,
      `date_jour`     date             NOT NULL,
      `heure_debut`   time             NOT NULL,
      `heure_fin`     time             NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `test` (`date_jour`, `heure_debut`,`heure_fin`) VALUES
      ('2016-05-01', '04:00:00', '11:00:00'),
      ('2016-05-01', '15:00:00', '18:00:00'),
      ('2016-05-02', '04:00:00', '11:00:00'),
      ('2016-05-02', '15:00:00', '18:00:00'),
      ('2016-05-03', '04:00:00', '11:00:00'),
      ('2016-05-02', '15:00:00', '18:00:00'),
      ('2016-05-04', '06:00:00', '08:30:00'),
      ('2016-05-04', '10:45:00', '11:25:00'),
      ('2016-05-05', '04:00:00', '11:00:00'),
      ('2016-05-05', '15:00:00', '18:00:00'),
      ('2016-05-06', '04:00:00', '11:00:00'),
      ('2016-05-06', '15:00:00', '18:00:00'),
      ('2016-05-07', '04:00:00', '11:00:00'),
      ('2016-05-07', '15:00:00', '18:00:00'),
      ('2016-05-08', '04:00:00', '11:00:00'),
      ('2016-05-08', '15:00:00', '18:00:00'),
      ('2016-05-09', '04:00:00', '11:00:00'),
      ('2016-05-09', '15:00:00', '18:00:00'),
      ('2016-05-10', '04:00:00', '11:00:00'),
      ('2016-05-10', '15:00:00', '18:00:00'),
      ('2016-05-31', '11:00:00', '13:30:00'),
      ('2016-05-31', '15:00:00', '17:00:00')
    --------------
     
    --------------
    select * from test
    --------------
     
    +----+------------+-------------+-----------+
    | id | date_jour  | heure_debut | heure_fin |
    +----+------------+-------------+-----------+
    |  1 | 2016-05-01 | 04:00:00    | 11:00:00  |
    |  2 | 2016-05-01 | 15:00:00    | 18:00:00  |
    |  3 | 2016-05-02 | 04:00:00    | 11:00:00  |
    |  4 | 2016-05-02 | 15:00:00    | 18:00:00  |
    |  5 | 2016-05-03 | 04:00:00    | 11:00:00  |
    |  6 | 2016-05-02 | 15:00:00    | 18:00:00  |
    |  7 | 2016-05-04 | 06:00:00    | 08:30:00  |
    |  8 | 2016-05-04 | 10:45:00    | 11:25:00  |
    |  9 | 2016-05-05 | 04:00:00    | 11:00:00  |
    | 10 | 2016-05-05 | 15:00:00    | 18:00:00  |
    | 11 | 2016-05-06 | 04:00:00    | 11:00:00  |
    | 12 | 2016-05-06 | 15:00:00    | 18:00:00  |
    | 13 | 2016-05-07 | 04:00:00    | 11:00:00  |
    | 14 | 2016-05-07 | 15:00:00    | 18:00:00  |
    | 15 | 2016-05-08 | 04:00:00    | 11:00:00  |
    | 16 | 2016-05-08 | 15:00:00    | 18:00:00  |
    | 17 | 2016-05-09 | 04:00:00    | 11:00:00  |
    | 18 | 2016-05-09 | 15:00:00    | 18:00:00  |
    | 19 | 2016-05-10 | 04:00:00    | 11:00:00  |
    | 20 | 2016-05-10 | 15:00:00    | 18:00:00  |
    | 21 | 2016-05-31 | 11:00:00    | 13:30:00  |
    | 22 | 2016-05-31 | 15:00:00    | 17:00:00  |
    +----+------------+-------------+-----------+
    --------------
    select 'semaine'                                as type,
           date_format(date_jour, '%Y-%v')          as periode,
           sec_to_time(sum(time_to_sec(amplitude))) as amplitude,
           sec_to_time(sum(time_to_sec(total)))     as total
    from (  select date_jour,
                   timediff(      max(heure_fin),       min(heure_debut)) as amplitude,
                   timediff(any_value(heure_fin), any_value(heure_debut)) as total
            from test
            group by date_jour
    ) as x
    group by periode
     
    union
     
    select 'mois'                                   as type,
           date_format(date_jour, '%Y-%m')          as periode,
           sec_to_time(sum(time_to_sec(amplitude))) as amplitude,
           sec_to_time(sum(time_to_sec(total)))     as total
    from (  select date_jour,
                   timediff(      max(heure_fin),       min(heure_debut)) as amplitude,
                   timediff(any_value(heure_fin), any_value(heure_debut)) as total
            from test
            group by date_jour
    ) as x
    group by periode
    --------------
     
    +---------+---------+-----------+----------+
    | type    | periode | amplitude | total    |
    +---------+---------+-----------+----------+
    | semaine | 2016-17 | 14:00:00  | 07:00:00 |
    | semaine | 2016-18 | 82:25:00  | 44:30:00 |
    | semaine | 2016-19 | 28:00:00  | 14:00:00 |
    | semaine | 2016-22 | 06:00:00  | 02:30:00 |
    | mois    | 2016-05 | 130:25:00 | 68:00:00 |
    +---------+---------+-----------+----------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    Dans mon dernier exemple, je t'ai donné trois requêtes, l'une par jour, par semaine et enfin par mois.
    Si c'est la requête par semaine que tu désires, tu ne prends que celle-ci.
    Je te la redonne ci-après. Je l'ai extraite de mon dernier 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
    select date_format(date_jour, '%Y-%v') as semaine,
           sec_to_time(sum(time_to_sec(amplitude))) as amplitude,
           sec_to_time(sum(time_to_sec(total)))     as total
    from (
     
    select date_jour,
           timediff(      max(heure_fin),       min(heure_debut)) as amplitude,
           timediff(any_value(heure_fin), any_value(heure_debut)) as total
    from test
    group by date_jour
     
    ) as x
    group by semaine
    --------------
     
    +---------+-----------+----------+
    | semaine | amplitude | total    |
    +---------+-----------+----------+
    | 2016-17 | 14:00:00  | 07:00:00 |
    | 2016-18 | 82:25:00  | 44:30:00 |
    | 2016-19 | 28:00:00  | 14:00:00 |
    | 2016-22 | 06:00:00  | 02:30:00 |
    +---------+-----------+----------+
    @+

  9. #9
    Membre averti
    Homme Profil pro
    Employé
    Inscrit en
    Octobre 2013
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Employé
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2013
    Messages : 51
    Par défaut ...
    Bonsoir

    Je ne comprends pas bien le
    sec_to_time(sum(time_to_sec(amplitude))) as amplitude

    A quoi correspond le sec_to_time(sum(time_to_sec(amplitude)
    Quelque chose m'échappe

    Eric Eychenne

  10. #10
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 883
    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 883
    Par défaut
    Salut eeychenne.

    Citation Envoyé par eeychenne
    Je ne comprends pas bien le sec_to_time(sum(time_to_sec(amplitude))) as amplitude
    On ne peut pas faire une somme directement sur le type "time".
    Je converti cette colonne en seconde ("time_to_sec()") puis ensuite je fais la somme ("sum()") toujours en seconde, et enfin, je la reconverti dans son type d'origine ("sec_to_time()"), c'est-à-dire le type "time".

    @+

  11. #11
    Membre averti
    Homme Profil pro
    Employé
    Inscrit en
    Octobre 2013
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Employé
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2013
    Messages : 51
    Par défaut sujet non clo
    Mon métier ne me permet pas de faire ce que je veux. Sujet donc en suspend, si vous le permettez

  12. #12
    Membre averti
    Homme Profil pro
    Employé
    Inscrit en
    Octobre 2013
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Employé
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2013
    Messages : 51
    Par défaut Heu
    Bonsoir

    Je suis fasse à un probleme

    La solution à ma question est ok sauf que....parfois les réponses de Mariadb sont éronnees.
    En piece jointe en voit que le 27 avril il y a une amplitude de 11 heures et un total de 10h30. Sauf que ce jour je n'ai travaillé que 4h50.

    D'ou peut venir le PB ?
    Images attachées Images attachées  

  13. #13
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 883
    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 883
    Par défaut
    Salut eeychenne.

    Il me faut le descriptif de la table et le jeu d'essai sur le problème que vous rencontrez.

    Il y a un truc bizarre dans votre requête.
    Pour afficher la date du jour, vous êtes obligé de faire un date_format().
    Par hasard, n'auriez-vous pas une date sous le type varchar() ?

    Pour que la requête fonctionne parfaitement, vous devez utiliser les types date et time et pas autre chose !

    EDIT: A priori, votre requête me semble correcte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select date_format(timestamp, '%Y-%m-%d')) as jour,
           timediff(max(endtime), min(starttime)) as amplitude,
           sec_to_time(sum(time_to_sec(timediff(endtime,starttime)))) as total
    from calendar_events
    group by jour
    limit 180,30;
    P.S.: il faut éviter de donner comme nom de colonnes, des mots clef de MySql !

    @+

  14. #14
    Membre averti
    Homme Profil pro
    Employé
    Inscrit en
    Octobre 2013
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Employé
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2013
    Messages : 51
    Par défaut On va y arriver :)
    Bonjour,

    Je tentais d'utiliser une colonne nomée Timestamp, dans laquelle j ai des valeurs comme celle-ci : 2016-01-12 12:00:00".
    C'est là que ça coinçait.
    Etant donné que j'ai aussi des colonnes nommées "year", "month", "day", si je fais la requête suivante, ça fonctionne bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT date_format( CONCAT( YEAR, '-',MONTH , '-',DAY ) , '%Y-%m-%d' ) AS jour, timediff( max( endtime ) , min( starttime ) )
    FROM calendar_events where month='5' and date_format(concat(YEAR,'-',MONTH,'-',DAY),'%u')='19' and YEAR='2016' group by jour
    J'obtiens bien les amplitudes pour chaque jours de la semaine 19.

    En revanche, si je fais la requete suivante, en fonction de votre exemple pour obtenir la somme des amplitudes, mysql me renvois une erreur comme quoi "unknown column "year" in field list ":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT date_format( CONCAT( year, '-',month , '-',day ) , '%Y-%v' ) AS semaine,
    sec_to_time(sum(time_to_sec(amplitude))) as amplitude
    from (
    SELECT date_format( CONCAT( year, '-',month , '-',day ) , '%Y-%m-%d' ),
    timediff( max( endtime ) , min( starttime ) ) as amplitude
    FROM calendar_events
    group by date_format( CONCAT( year, '-',month , '-',day ) , '%Y-%m-%d' )
    ) as x
    group by semaine

    Un grand merci pour votre attention

    Eric Eychenne

  15. #15
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 883
    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 883
    Par défaut
    Salut eeychenne.

    Il me faut le descriptif de la table (nom des colonnes, type, ...) qui est votre DDL.
    Ainsi qu'un jeu d'essai afin que je reproduise votre problème chez moi.

    Sans cela, je ne peux rien faire.

    @+

  16. #16
    Membre averti
    Homme Profil pro
    Employé
    Inscrit en
    Octobre 2013
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Employé
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2013
    Messages : 51
    Par défaut piece jointe
    Bonsoir,

    En PJ, la base complete. Elle n'est pas grosse
    Merci pour votre aide

    Eric Eychenne
    Fichiers attachés Fichiers attachés

  17. #17
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 883
    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 883
    Par défaut
    Salut eeychenne.

    Je suis dans la version MySql 5.6.30.

    Je viens de charger ta base de données et en effet, elle n'est pas très grosse. Le fichier ".sql" à une taille de 61,1 Ko.

    Je n'ai pas bidouiller dans ta base, et j'ai repris ta requête, telle quelle !
    J'ai comparé tes résultats avec ceux que j'obtiens. J'ai trouvé deux dates qui ne sont pas en concordance.
    Ce sont les dates "2016-04-27" et "2016-05-11".

    Il y a déjà un problème, puisque avec ta requête, je n'obtiens pas les mêmes résultats que toi.

    Voici le test que je viens de faire chez moi :
    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
    --------------
    select date_format(timestamp, '%Y-%m-%d')     as jour,
           timediff(max(endtime), min(starttime)) as amplitude,
           sec_to_time(sum(time_to_sec(timediff(endtime,starttime)))) as total
    from calendar_events
    group by jour
    limit 180,30
    --------------
     
    +------------+-----------+----------+
    | jour       | amplitude | total    |
    +------------+-----------+----------+
    | 2016-04-21 | 10:55:00  | 08:55:00 |
    | 2016-04-23 | 09:55:00  | 07:10:00 |
    | 2016-04-25 | 03:25:00  | 03:25:00 |
    | 2016-04-27 | 13:00:00  | 15:20:00 |
    | 2016-04-28 | 12:15:00  | 07:45:00 |
    | 2016-04-29 | 10:00:00  | 09:25:00 |
    | 2016-04-30 | 07:30:00  | 04:25:00 |
    | 2016-05-02 | 08:55:00  | 05:50:00 |
    | 2016-05-03 | 11:45:00  | 09:20:00 |
    | 2016-05-04 | 05:00:00  | 03:30:00 |
    | 2016-05-05 | 11:30:00  | 08:00:00 |
    | 2016-05-06 | 09:55:00  | 09:25:00 |
    | 2016-05-07 | 08:30:00  | 05:40:00 |
    | 2016-05-09 | 04:00:00  | 04:00:00 |
    | 2016-05-10 | 12:35:00  | 09:10:00 |
    | 2016-05-11 | 08:40:00  | 07:10:00 |
    | 2016-05-12 | 11:00:00  | 07:25:00 |
    +------------+-----------+----------+
    --------------
    select timestamp, starttime, endtime
    from calendar_events
    where date(timestamp) in ('2016-04-27', '2016-05-11')
    order by timestamp
    --------------
     
    +---------------------+-----------+----------+
    | timestamp           | starttime | endtime  |
    +---------------------+-----------+----------+
    | 2016-04-27 06:20:17 | 06:00:00  | 12:10:00 |
    | 2016-04-27 06:20:50 | 13:25:00  | 17:45:00 |
    | 2016-04-27 17:40:31 | 14:10:00  | 19:00:00 |
    | 2016-05-11 16:22:11 | 09:05:00  | 11:10:00 |
    | 2016-05-11 16:23:05 | 12:30:00  | 16:15:00 |
    | 2016-05-11 16:23:24 | 16:25:00  | 17:45:00 |
    +---------------------+-----------+----------+
    --------------
    select date(timestamp) as jour,
                                       timediff(max(endtime), min(starttime))   as amplitude,
           sec_to_time(sum(time_to_sec(timediff(    endtime,      starttime)))) as total
    from calendar_events
    group by jour
    having jour in ('2016-04-27', '2016-05-11')
    --------------
     
    +------------+-----------+----------+
    | jour       | amplitude | total    |
    +------------+-----------+----------+
    | 2016-04-27 | 13:00:00  | 15:20:00 |
    | 2016-05-11 | 08:40:00  | 07:10:00 |
    +------------+-----------+----------+
     
    Appuyez sur une touche pour continuer...
    Les résultats sont correctes chez moi, même avec ta requête.

    Qu'est-ce que tu as cherché à faire avec limit 180,30 ?

    @+

  18. #18
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 883
    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 883
    Par défaut
    Salut eeychenne.

    Je pense avoir compris ce qui se passe.

    Dans le cas de la date du '2016-04-27', les deux premières lignes ont été sélectionnées.
    Ce qui donne : 11H45 et 10H30.
    Ce qui correspond à l'amplitude allant de 17h45 - 6h00 soit 11h45. Et à un total de : 6h10 + 4h20 soit 10h30.

    Dans le cas de la date du '2056-05-11', c'est un peu plus problématique, car je ne retrouve pas tes résultats.
    Ce qui donne : 9h55 et 12h00.
    On ne peut pas obtenir ton total, car cela donne : 2h05 + 3h45 + 1h20 soit 7h10 et tu trouves 12h00.
    Pour l'amplitude, c'est pareil, de 9h05 à 17h45 soit 8h40 et tu trouves 9h55.
    On dirait qu'il manque une ligne ???

    @+

  19. #19
    Membre averti
    Homme Profil pro
    Employé
    Inscrit en
    Octobre 2013
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Employé
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2013
    Messages : 51
    Par défaut et
    Bonjour,

    et cette requete fonctionne chez toi ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT date_format( CONCAT( year, '-',month , '-',day ) , '%Y-%v' ) AS semaine,
    sec_to_time(sum(time_to_sec(amplitude))) as amplitude
    from (
    SELECT date_format( CONCAT( year, '-',month , '-',day ) , '%Y-%m-%d' ),
    timediff( max( endtime ) , min( starttime ) ) as amplitude
    FROM calendar_events
    group by date_format( CONCAT( year, '-',month , '-',day ) , '%Y-%m-%d' )
    ) as x
    group by semaine
    Merci

  20. #20
    Membre averti
    Homme Profil pro
    Employé
    Inscrit en
    Octobre 2013
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Employé
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2013
    Messages : 51
    Par défaut parce que
    Je reprends ce que je disais plus haut.
    La reque qui suit fonctionne tres bien pour la somme des amplis quotidiennes sur une semaine donnée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT date_format( CONCAT( YEAR, '-',MONTH , '-',DAY ) , '%Y-%m-%d' ) AS jour, timediff( max( endtime ) , min( starttime ) )
    FROM calendar_events where month='5' and date_format(concat(YEAR,'-',MONTH,'-',DAY),'%u')='19' and YEAR='2016' group by jour
    Mon souci est que je veux avoir la somme des amplis sur cette dite semaine, et aussi la somme pour le mois.
    Et suivant ton exemple et bien,....je n'y arrive pas
    Il faut dire que je ne suis pas un gouroux de SQL

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Total des heures avec la fonction somme.si
    Par qmike dans le forum Excel
    Réponses: 2
    Dernier message: 22/04/2014, 20h53
  2. Somme des heures de travail.
    Par Nounours1 dans le forum Excel
    Réponses: 5
    Dernier message: 27/05/2008, 18h34
  3. Calcul des heures avec résultat en euro
    Par Philippe608 dans le forum Excel
    Réponses: 5
    Dernier message: 26/05/2008, 19h19
  4. saisir des heures avec le pavé numérique
    Par isodoro dans le forum Excel
    Réponses: 1
    Dernier message: 11/04/2007, 10h08
  5. [phpMyAdmin] problème au niveau des heures avec phpMyAdmin
    Par arti2004 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 13/06/2006, 22h05

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