問題:
タイプがdatetime
の2つの列があります そして、それらの間の差を計算したい。
例:
旅行
テーブルには、次の3つの列があります: id
、出発
、および到着
。 到着
の差を計算したい およびdeparture
。
旅行
テーブルは次のようになります:
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, DATEDIFF(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 |
ディスカッション:
到着
間の差を計算するには T-SQLでの出発には、 DATEDIFF(datepart、startdate、enddate)
を使用します。 働き。 datepart
引数はマイクロ秒
にすることができます 、 second
、分コード> 、
時間
、 day
、週
、 month
、四半期コード> 、または
year
。ここでは、秒単位で差を取得したいので、秒を選択します。時間の差を取得するには、 hour
を選択します;月の違いについては、 month
を選択してください 、など。 startdate
およびenddate
引数は、開始と終了の datetime
です。 それぞれ列(ここでは、 departure
および到着
、それぞれ)。
ソリューション2(日、時間、分、秒の違い):
WITH difference_in_seconds AS ( SELECT id, departure, arrival, DATEDIFF(SECOND, departure, arrival) AS seconds FROM travel ), differences AS ( SELECT id, departure, arrival, seconds, seconds % 60 AS seconds_part, seconds % 3600 AS minutes_part, 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秒 |
ディスカッション:
まず、到着
の差を計算します およびdeparture
DATEDIFF()
を使用して数秒で 関数( difference_in_seconds
という名前の最初のCTE )、ソリューション1と同様に、次に、1分を超える秒数を計算します( seconds_part
)後で秒を計算するために使用されます。1時間( minutes_part
)を超える秒数です。 )後で分を計算するために使用され、1時間( hours_part
)を超える秒数が計算されます )後で時間を計算するために使用されます。
これを行うには、%演算子を使用します。たとえば、1時間は3600秒なので、 minutes_part
に何秒あるかを調べます。 、次のように3600で除算した余りを求めます。
seconds%3600 AS minutes_part
同様に、 3600 * 24
があります 1日の秒数なので、 hours_part
に何秒あるかを計算します 、書き込み:
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
ここに示すソリューションは、 datetime
を返します テキストとしての違い。ソリューションを簡単に変更して、テキストなしで数字のみを取得できます。日、時間、分、秒をさまざまな列に保存することもできます:
FLOOR(seconds / 3600 / 24) AS days, FLOOR(hours_part / 3600) AS hours, FLOOR(minutes_part / 60) AS minutes, seconds_part AS seconds