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

SQL ServerでのDATEDIFF()の例

    SQL Serverでは、T-SQL DATEDIFF()を使用できます。 2つの日付/時刻の差を返す関数。 時間に解決できるすべての式で機能します 、日付 smalldatetime 日時 datetime2 、または datetimeoffset 価値。

    この記事では、DATEDIFF()の例を紹介します。 SQLServerで機能します。

    構文

    まず、構文は次のとおりです。

    DATEDIFF ( datepart , startdate , enddate )

    datepart 比較したい日付の部分です。 開始日 は最初の日付であり、終了日 は終了日です。

    それが機能する方法は、指定された datepart のカウントを(符号付き整数値として)返すことです。 指定された開始日の間で境界を越えました およびenddate

    例1

    2つの日付の間の日数を調べる基本的な例を次に示します。

    SELECT DATEDIFF(day, '2001-01-01', '2002-01-01') AS Result;

    結果:

    +----------+
    | Result   |
    |----------|
    | 365      |
    +----------+
    

    例2

    2つの変数を宣言し、それらに2つの異なる日付を割り当てる別の例を次に示します(DATEADD()を使用します 最初の日付に1年を追加します)。次に、DATEDIFF()を使用します その日付のさまざまな日付部分を返すには:

    DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000';
    DECLARE @date2 datetime2 = DATEADD(year, 1, @date1);
    SELECT 
        DATEDIFF( year, @date1, @date2 ) AS Years,
        DATEDIFF( quarter, @date1, @date2 ) AS Quarters,
        DATEDIFF( month, @date1, @date2 ) AS Months,
        DATEDIFF( week, @date1, @date2 ) AS Weeks,
        DATEDIFF( dayofyear, @date1, @date2 ) AS DayOfYear,
        DATEDIFF( day, @date1, @date2 ) AS Days;

    結果:

    +---------+------------+----------+---------+-------------+--------+
    | Years   | Quarters   | Months   | Weeks   | DayOfYear   | Days   |
    |---------+------------+----------+---------+-------------+--------|
    | 1       | 4          | 12       | 53      | 366         | 366    |
    +---------+------------+----------+---------+-------------+--------+
    

    例3

    前述のように、日付間の時間部分を返すこともできます。日付/時刻の値の間の時間、分、秒の数を返す例を次に示します。

    DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000';
    DECLARE @date2 datetime2 = DATEADD(hour, 1, @date1);
    SELECT 
        DATEDIFF( hour, @date1, @date2 ) AS Hours,
        DATEDIFF( minute, @date1, @date2 ) AS Minutes,
        DATEDIFF( second, @date1, @date2 ) AS Seconds;

    結果:

    +---------+-----------+-----------+
    | Hours   | Minutes   | Seconds   |
    |---------+-----------+-----------|
    | 1       | 60        | 3600      |
    +---------+-----------+-----------+
    

    例4

    次に、2つの日付/時刻値の間のミリ秒、マイクロ秒、およびナノ秒の数を取得する例を示します。

    DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000';
    DECLARE @date2 datetime2 = DATEADD(millisecond, 1, @date1);
    SELECT    
        DATEDIFF( millisecond, @date1, @date2 ) AS Milliseconds,
        DATEDIFF( microsecond, @date1, @date2 ) AS Microseconds,
        DATEDIFF( nanosecond, @date1, @date2 ) AS Nanoseconds;

    結果:

    +----------------+----------------+---------------+
    | Milliseconds   | Microseconds   | Nanoseconds   |
    |----------------+----------------+---------------|
    | 1              | 1000           | 1000000       |
    +----------------+----------------+---------------+
    

    例5–エラー!

    100年でナノ秒数を返すなど、極端なことをしようとすると、エラーが発生します。これは、DATEDIFF() intを返します 値であり、100年で intよりも多くのナノ秒があります データ型は処理できます。

    それで、これを行おうとするとどうなりますか:

    DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000';
    DECLARE @date2 datetime2 = DATEADD(year, 100, @date1);
    SELECT    
        DATEDIFF( millisecond, @date1, @date2 ) AS Milliseconds,
        DATEDIFF( microsecond, @date1, @date2 ) AS Microseconds,
        DATEDIFF( nanosecond, @date1, @date2 ) AS Nanoseconds;

    結果:

    The datediff function resulted in an overflow. The number of dateparts separating two date/time instances is too large. Try to use datediff with a less precise datepart. 
    

    幸い、100年で何ナノ秒かを本当に知る必要がある場合は、DATEDIFF_BIG()を使用できます。 代わりに機能します。この関数は、署名された bigintを返します DATEDIFF()よりもはるかに大きな値を返すことができるデータ型 できます。

    例6–奇妙な結果を得る?

    DATEDIFF()から得られる結果 関数が実際にどのように機能するかわからない場合、完全に間違って見えることがあります。

    例:

    DECLARE 
      @startdate datetime2 = '2016-01-01  00:00:00.0000000', 
      @enddate datetime2 = '2016-12-31 23:59:59.9999999';
    SELECT 
      DATEDIFF(day, @startdate, @enddate) Days,
      DATEDIFF(year, @startdate, @enddate) Years;
    

    結果:

    +--------+---------+
    | Days   | Years   |
    |--------+---------|
    | 365    | 0       |
    +--------+---------+
    

    DATEDIFF()の方法がわからない場合 実際には機能しますが、この結果は非常に間違っているように見える可能性があるため、バグであると想定することは許されます。しかし、それはバグではありません。

    DATEDIFF()がSQL Serverで間違った結果を返すのを確認してください?これを読む。この例と、結果が完全に間違っているように見えるが完全に正しい他のケースを確認するために(そして、なぜそれらがそのように見えるのかについての説明のために)

    そのページの例の1つは、おそらくここでもう一度言及する価値があります。 DATEDIFF() 実際にはSET DATEFIRSTを無視します 価値。これにより、特に日曜日を週の最初の日として使用しない文化にいる場合は、予期しない結果が生じる可能性があります。影響を受ける可能性があると思われる場合は、SQLServerでSETDATEFIRSTを無視するDATEDIFF()のこの回避策を確認してください。


    1. テーブルを再作成する必要がある変更を保存しないようにするマイナスの影響

    2. Oracle sqlチュートリアル:基本的なSQLステートメント

    3. MaxscaleからProxySQLロードバランサーへの移行

    4. Oracleデータベースでユーザー定義データ型を使用してネストされたテーブルを作成する方法