recherche

Maison  >  Questions et réponses  >  le corps du texte

Comptage horaire basé sur les données d'heure de début et d'heure de fin

<p>Dans le tableau, les données sont au format horodatage mais je les partage au format time(start_at) et time(end_at). </p> <p>Structure du tableau :</p> <pre class="brush:php;toolbar:false;">id, start_at, end_at 1, 03:00:00, 06:00:00 2, 02:00:00, 05:00:00 3, 01:00:00, 08:00:00 4, 08:00:00, 13:00:00 5, 09:00:00, 21:00:00 6, 13:00:00, 16:00:00 6, 15:00:00, 19:00:00</pré> <p>Pour le résultat, nous devons compter le nombre d'identifiants actifs entre les heures start_at et end_at. </p> <pre class="brush:php;toolbar:false;">heures, nombre 0, 0 1, 1 vingt-deux 3, 3 4, 3 5, 2 6, 1 7, 1 8,1 9, 2 10, 2 11, 2 12, 2 13, 3 14, 2 15, 3 16, 2 17, 2 18, 2 19,1 20,1 21,0 22,0 23, 0≪/pré>≪/p>
P粉283559033P粉283559033483 Il y a quelques jours469

répondre à tous(1)je répondrai

  • P粉432930081

    P粉4329300812023-08-31 09:26:55

    ou

    WITH RECURSIVE
    cte AS (
        SELECT 0 `hour`
        UNION ALL
        SELECT `hour` + 1 FROM cte WHERE `hour` < 23
    )
    SELECT cte.`hour`, COUNT(test.id) `count`
    FROM cte 
    LEFT JOIN test ON cte.`hour` >= HOUR(test.start_at)
                  AND cte.`hour` < HOUR(test.end_at)
    GROUP BY 1
    ORDER BY 1;
    

    ou

    WITH RECURSIVE
    cte AS (
        SELECT CAST('00:00:00' AS TIME) `hour`
        UNION ALL
        SELECT `hour` + INTERVAL 1 HOUR FROM cte WHERE `hour` < '23:00:00'
    )
    SELECT cte.`hour`, COUNT(test.id) `count`
    FROM cte 
    LEFT JOIN test ON cte.`hour` >= test.start_at 
                  AND cte.`hour` < test.end_at 
    GROUP BY 1
    ORDER BY 1;
    

    La première requête renvoie la colonne heure au format heure, tandis que la deuxième requête renvoie cette colonne sous forme numérique. Choisissez la variante qui est sûre pour vous.

    https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=5a77b6e3158be06c7a551cb7e64673de

    répondre
    0
  • Annulerrépondre