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

DATEDIFF_BIG()SQLServerの例

    SQL Serverでは、DATEDIFF_BIG()を使用できます。 DATEDIFF()の代わりに関数 戻り値が非常に大きいと予想される場合は関数。たとえば、1000年のミリ秒数を調べようとすると、エラーが発生します。

    これは、DATEDIFF() intを返します データ型であり、結果が大きすぎてそのデータ型で処理できません。一方、DATEDIFF_BIG() 関数は署名されたbigintを返します データ型。これを使用して、はるかに大きな値を返すことができます。つまり、はるかに広い範囲の日付で使用できます。

    それ以外は、2つの機能に実際の違いはありません。

    この記事では、DATEDIFF_BIG()の使用例を紹介しています。 SQLServerで機能します。

    構文

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

    DATEDIFF_BIG ( datepart , startdate , enddate )

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

    この関数はstartdateを減算します 終了日から 。

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

    これは、DATEDIFF()で使用される構文とまったく同じです。 機能。

    例1

    これは、それがどのように機能するかを示すための基本的な例です。

    SELECT DATEDIFF_BIG(day, '0001-01-01', '9002-01-01') AS Result;

    結果:

    +----------+
    | Result   |
    |----------|
    | 3287547  |
    +----------+
    

    この場合、DATEDIFF()を使用できた可能性があることに注意してください 、結果は整数に対して大きすぎないため。

    例2

    これは、2つの日付からのさまざまな日付部分の差を返す例です。この場合、2つの変数を宣言し、それらに2つの異なる日付を割り当てます(DATEADD()を使用します 最初のデートに1000年を追加する関数):

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

    結果:

    +---------+------------+----------+---------+-------------+--------+
    | Years   | Quarters   | Months   | Weeks   | DayOfYear   | Days   |
    |---------+------------+----------+---------+-------------+--------|
    | 1000    | 4000       | 12000    | 52178   | 365243      | 365243 |
    +---------+------------+----------+---------+-------------+--------+
    

    ここでも、DATEDIFF()を使用できます。 、結果が整数に対して大きすぎることはないためです。

    例3

    この例では、2つの日付の間の時間、分、秒を返します。

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

    結果:

    +---------+-----------+-------------+
    | Hours   | Minutes   | Seconds     |
    |---------+-----------+-------------|
    | 8765832 | 525949920 | 31556995200 |
    +---------+-----------+-------------+
    

    これで、DATEDIFF() エラーが返されます。 intには秒数が大きすぎます (ただし、 bigintの場合は対象外です 。

    例4

    最後に、ミリ秒、マイクロ秒、ナノ秒の例を次に示します。

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

    結果:

    +----------------+------------------+---------------------+
    | Milliseconds   | Microseconds     | Nanoseconds         |
    |----------------+------------------+---------------------|
    | 3155760000000  | 3155760000000000 | 3155760000000000000 |
    +----------------+------------------+---------------------+
    

    この場合、DATEDIFF_BIG()のメリットがはっきりとわかります。 DATEDIFF()を超えています 。 DATEDIFF() 3つすべてで倒れていたでしょう。


    1. Oracle DB:大文字と小文字を区別せずにクエリを作成するにはどうすればよいですか?

    2. 修正:「現在のデータベースのバックアップがないため、バックアップログを実行できません。」 SQL Server /SQLEdgeで

    3. テキストとvarcharの違い(文字が異なります)

    4. テーブルの列が同じ場合、EXCEPTはJOINよりも高速に実行されますか