sql >> データベース >  >> RDS >> Mysql

MySQLで2つのタイムスタンプの差を計算する方法

    問題:

    タイムスタンプタイプの2つの列があり、それらの差を計算したい。

    例:

    travel テーブルには、次の3つの列があります:iddeparture 、およびarrivalarrivalの差を計算したい およびdeparture

    travel テーブルは次のようになります:

    id 出発 到着
    1 2018-03-25 12:00:00 2018-04-05 07:30:00
    2 2019-09-12 15:50:00 2019-10-23 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

    ソリューション1(日、時間、分、または秒の違い):

    SELECT
      id,
      departure,
      arrival,
      TIMESTAMPDIFF(SECOND, departure, arrival) AS difference
    FROM travel;
    

    結果は次のとおりです。

    id 出発 到着 違い
    1 2018-03-25 12:00:00 2018-04-05 07:30:00 934200
    2 2019-09-12 15:50:00 2019-10-23 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

    ディスカッション:

    MySQLのタイムスタンプ間の差を計算するには、TIMESTAMPDIFF(unit, start, end)を使用します 働き。単位引数はMICROSECONDにすることができます 、SECONDMINUTEHOURDAYWEEKMONTHQUARTER 、またはYEAR 。ここで行ったように秒単位で差を取得するには、SECONDを選択します 。分単位で差を取得するには、MINUTEを選択します;時間の違いについては、HOURを選択してください 、など。end引数とstart引数は、それぞれ終了タイムスタンプと開始タイムスタンプです(ここでは、departure およびarrivalrespectively

    ソリューション2(日、時間、分、秒の違い):

    WITH difference_in_seconds AS (
      SELECT
        id,
        departure,
        arrival,
        TIMESTAMPDIFF(SECOND, departure, arrival) AS seconds
      FROM travel
    ),
    
    differences AS (
      SELECT
        id,
        departure,
        arrival,
        seconds,
        MOD(seconds, 60) AS seconds_part,
        MOD(seconds, 3600) AS minutes_part,
        MOD(seconds, 3600 * 24) AS hours_part
      FROM difference_in_seconds
    )
    
    SELECT
      id,
      departure,
      arrival,
      CONCAT(
        FLOOR(seconds / 3600 / 24), ' days ',
        FLOOR(hours_part / 3600), ' hours ',
        FLOOR(minutes_part / 60), ' minutes ',
        seconds_part, ' seconds'
      ) AS difference
    FROM differences;
    

    結果は次のとおりです。

    id 出発 到着 違い
    1 2018-03-25 12:00:00 2018-04-05 07:30:00 10日19時間30分0秒
    2 2019-09-12 15:50:00 2019-10-23 10:30:30 40日18時間40分30秒
    3 2018-07-14 16:15:00 2018-07-14 20:40:30 0日4時間25分30秒
    4 2018-01-05 08:35:00 2019-01-08 14:00:00 368日5時間25分0秒

    ディスカッション:

    まず、TIMESTAMPDIFF()を使用して、タイムスタンプ間の差を秒単位で計算します 関数(difference_in_secondsという名前の最初のCTE )、ソリューション1と同様に、1分を超える秒数を計算します(seconds_part )後で秒を計算するために使用されます。1時間(minutes_part)を超える秒数です。 )後で分を計算するために使用され、1時間(hours_part)を超える秒数が計算されます )後で時間を計算するために使用されます。

    これを行うには、MOD()を使用します 働き。たとえば、1時間は3600秒なので、minutes_partに何秒あるかを調べます。 、次のように3600で除算した余りを求めます。

    MOD(seconds, 3600) AS minutes_part

    同様に、3600 * 24があります 1日の秒数なので、hours_partに何秒あるかを計算します 、書き込み:

    MOD(seconds, 3600 * 24) AS hours_part

    これらの余りが計算されると(2番目のCTEで、differencesという名前が付けられます )、最終的に日、時間、分、秒の差を得ることができます。秒、分、時間、および日数を取得するには、余りの秒数を、日、時間、または分での対応する秒数で割ります。たとえば、表示する分数を確認するには、minutes_partを使用します。 1時間に60分あるので、60で割ります。この中の整数部分(つまり、小数部分なし)のみが必要なので、次のようにFLOOR()関数を使用します。

    FLOOR(minutes_part / 60)

    最後に、計算した内容を1つの文字列に表示するだけです。これを行うには、CONCAT()を使用します 外部クエリの関数:

    CONCAT(
        FLOOR(seconds / 3600 / 24), ' days ',
        FLOOR(hours_part / 3600), ' hours ',
        FLOOR(minutes_part / 60), ' minutes ',
        seconds_part, ' seconds'
      ) AS difference
    

    ここに示すソリューションは、最後の列をテキストとして返します。このソリューションを簡単に変更して、他の形式で表示することができます。次のように、番号を別々の列に表示することもできます。

    FLOOR(seconds / 3600 / 24) AS days,
    FLOOR(hours_part / 3600) AS hours,
    FLOOR(minutes_part / 60) AS minutes,
    seconds_part AS seconds
    

    1. 日付形式(DBまたは出力)をdd / mm/yyyyに変更します-PHPMySQL

    2. Oracle:クエリで合計のパーセントを取得する方法は?

    3. 標準フォーマット文字列(T-SQL)を使用してSQLServerで「datetimeoffset」をフォーマットする例

    4. PostgresのGROUPBY-JSONデータ型に同等性はありませんか?