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

T-SQLで2つの日時の差を計算する方法

    問題:

    タイプが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
    

    1. PDOが疑問符をプレースホルダーとして解釈しないようにするにはどうすればよいですか?

    2. SQL Server文字列関数(完全なリスト)

    3. MySqlエラー:1364フィールド'display_name'にデフォルト値がありません

    4. 1つのクエリで複数のテーブルに挿入