sql >> Databáze >  >> RDS >> Mysql

Jak vypočítat rozdíl mezi dvěma časovými razítky v MySQL

Problém:

Máte dva sloupce typu časové razítko a chcete vypočítat rozdíl mezi nimi.

Příklad:

V travel tabulka má tři sloupce:id , departure a arrival . Chcete vypočítat rozdíl mezi arrival a departure .

travel tabulka vypadá takto:

id odjezd příjezd
1 2018-03-25 12:00:00 2018-04-05 07:30:00
2 2019-09-12 15:50:00 23. 10. 2019 10:30:30
3 2018-07-14 16:15:00 2018-07-14 20:40:30
4 2018-01-05 08:35:00 2019-01-08 14:00:00

Řešení 1 (rozdíl ve dnech, hodinách, minutách nebo sekundách):

VYBRAT id, odjezd, příjezd, TIMESTAMPDIFF(SECOND; odjezd, příjezd) JAKO rozdílFROM cestování;

Výsledek je:

id odjezd příjezd rozdíl
1 2018-03-25 12:00:00 2018-04-05 07:30:00 934200
2 2019-09-12 15:50:00 23. 10. 2019 10:30:30 3523230
3 2018-07-14 16:15:00 2018-07-14 20:40:30 15930
4 2018-01-05 08:35:00 2019-01-08 14:00:00 31814700

Diskuse:

Chcete-li vypočítat rozdíl mezi časovými razítky v MySQL, použijte TIMESTAMPDIFF(unit, start, end) funkce. Argument jednotky může být MICROSECOND , SECOND , MINUTE , HOUR , DAY , WEEK , MONTH , QUARTER nebo YEAR . Chcete-li získat rozdíl v sekundách, jako jsme to udělali zde, vyberte SECOND . Chcete-li zjistit rozdíl v minutách, zvolte MINUTE; pro rozdíl v hodinách zvolte HOUR , atd. Argumenty end a start jsou koncové časové razítko a počáteční časové razítko (zde departure a arrival , respectively ).

Řešení 2 (rozdíl ve dnech, hodinách, minutách a sekundách):

WITH rozdíl_v_sekundách AS ( SELECT id, odjezd, příjezd, TIMESTAMPDIFF(SECOND, odjezd, příjezd) AS sekund FROM cesty),rozdíly AS ( SELECT id, odjezd, příjezd, sekundy, MOD(sekundy, 60) AS část_sekund, MOD (sekundy, 3600) AS část_minut, MOD(sekundy, 3600 * 24) AS část_hodin FROM rozdíl_v_sekundách)SELECT id, odjezd, příjezd, CONCAT( FLOOR(sekundy / 3600 / 24), ' dny ', FLOOR(část_hodin / 3600), ' hodiny ', FLOOR(část_minut / 60), 'minuty', část_sekund, 'sekundy' ) JAKO rozdíl OD rozdílů;

Výsledek je:

id odjezd příjezd rozdíl
1 2018-03-25 12:00:00 2018-04-05 07:30:00 10 dní 19 hodin 30 minut 0 sekund
2 2019-09-12 15:50:00 23. 10. 2019 10:30:30 40 dní 18 hodin 40 minut 30 sekund
3 2018-07-14 16:15:00 2018-07-14 20:40:30 0 dnů 4 hodin 25 minut 30 sekund
4 2018-01-05 08:35:00 2019-01-08 14:00:00 368 dní 5 hodin 25 minut 0 sekund

Diskuse:

Nejprve vypočítejte rozdíl mezi časovými razítky v sekundách pomocí TIMESTAMPDIFF() funkce (první CTE s názvem difference_in_seconds ), stejně jako v řešení 1. Spočítejte, kolik sekund překračuje celé minuty (seconds_part ), který se později použije k výpočtu sekund, kolik sekund překračuje celé hodiny (minutes_part ), který se později použije k výpočtu minut a počtu sekund, které překračují celé hodiny (hours_part ), který se použije později k výpočtu hodin.

Chcete-li to provést, použijte MOD() funkce. Například hodina má 3600 sekund, abyste zjistili, kolik sekund má v minutes_part , najděte zbytek z dělení 3600 takto:

MOD(seconds, 3600) AS minutes_part

Podobně existují 3600 * 24 sekund za den, takže vypočítat, kolik sekund je v hours_part , napište:

MOD(seconds, 3600 * 24) AS hours_part

Jakmile jsou tyto zbytky vypočteny (ve druhém CTE, nazvaném differences ), můžete konečně získat rozdíl ve dnech, hodinách, minutách a sekundách. Chcete-li získat počet sekund, minut, hodin a dnů, vydělte zbývající počet sekund odpovídajícím počtem sekund ve dnech, hodinách nebo minutách. Chcete-li například zjistit, kolik minut by se mělo zobrazit, použijte minutes_part a vydělte to 60, protože hodina má 60 minut. Z tohoto potřebujete pouze celočíselnou část (tj. bez desetinné části), takže použijte funkci FLOOR() takto:

FLOOR(minutes_part / 60)

Nakonec musíte jednoduše zobrazit v jednom řetězci to, co jste vypočítali. Chcete-li to provést, použijte CONCAT() funkce ve vnějším dotazu:

CONCAT( FLOOR(sekundy / 3600 / 24), ' dny ', FLOOR(část_hodin / 3600), ' hodiny ', FLOOR(část_minut / 60), 'minuty', část_sekund, 'sekundy') AS rozdíl 

Zde uvedené řešení vrátí poslední sloupec jako text. Toto řešení můžete snadno upravit a zobrazit jej v jiném formátu. Čísla můžete také zobrazit v samostatných sloupcích, například takto:

FLOOR(sekundy / 3600 / 24) AS dny,FLOOR(část_hodin / 3600) AS hodiny,FLOOR(část_minut / 60) AS minuty,část_sekund AS sekund

  1. 4 funkce pro získání hodiny z časové hodnoty v MariaDB

  2. Jak vytvořit DB propojení mezi dvěma instancemi Oracle

  3. 5 příznaků, že jste překonali Excel

  4. Jak mohu získat součet více hodnot datetime?