問題:
タイムスタンプタイプの2つの列があり、それらの差を計算したい。
例:
travel
テーブルには、次の3つの列があります:id
、departure
、およびarrival
。 arrival
の差を計算したい および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
にすることができます 、SECOND
、MINUTE
、HOUR
、DAY
、WEEK
、MONTH
、QUARTER
、またはYEAR
。ここで行ったように秒単位で差を取得するには、SECOND
を選択します 。分単位で差を取得するには、MINUTE
を選択します;時間の違いについては、HOUR
を選択してください 、など。end引数とstart引数は、それぞれ終了タイムスタンプと開始タイムスタンプです(ここでは、departure
およびarrival
、respectively
。
ソリューション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