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

SQL ServerのDATEDIFF()とDATEDIFF_BIG():違いは何ですか?

    SQL Serverで2つの日付の違いを見つける必要がある場合は、DATEDIFF()を使用した可能性があります。 働き。この関数は、 datepartを使用して2つの日付間の時間を返します あなたが指定します。たとえば、日付1から日付2までの日数を返すために使用できます。また、分、秒、月、年などの数を返すように取得することもできます。

    DATEDIFF_BIG() 関数はまったく同じように機能しますが、微妙な違いが1つあります。それは戻りデータ型です。

    したがって、これら2つの関数の違いは、戻り値のデータ型です。

    • DATEDIFF() 符号付き整数( int )を返します )
    • DATEDIFF_BIG() 符号付きの大きな整数を返します( bigint

    場合によっては、 bigintを返す必要があまりないこともあります。 データ・タイプ。これは非常に大きな数であり、DATEDIFF()を使用するかどうかを表します またはDATEDIFF_BIG() 違いはありません(ストレージ要件を除く– int 4バイトを使用、 bigint 8バイトを使用します。

    ただし、次のエラーが発生した場合:

    datediff関数がオーバーフローを引き起こしました。 2つの日付/時刻インスタンスを区切る日付部分の数が多すぎます。精度の低い日付部分でdatediffを使用してみてください。

    戻り値が大きすぎるためです。

    この場合、次の3つのいずれかを行う必要があります。

    • より短い期間を使用します。たとえば、26日間のミリ秒数を返す代わりに、25を試してください。
    • 精度の低いdatepartを使用する 。たとえば、ミリ秒数を返すのではなく、ほんの数秒で返します。
    • DATEDIFF_BIG()を使用します 代わりに機能します。

    最初の2つのオプションが適切でない場合があります。 26日間の期間が必要な場合、25はそれを短縮するつもりはありません。また、2038年以降のUnixタイムスタンプが必要な場合、DATEDIFF()を使用すると、2038年問題が発生します。 。

    いずれにせよ、DATEDIFF_BIG() 関数を使用すると、DATEDIFF()よりもはるかに広い範囲の結果が得られます。 。

    DATEDIFF()の類似点と相違点の両方を示す2つの例を次に示します。 およびDATEDIFF_BIG()

    同じ結果

    両方の関数が同じ結果を生成する例を次に示します。

    DECLARE @date1 datetime2 = SYSDATETIME();  
    DECLARE @date2 datetime2 = DATEADD(second, 1, SYSDATETIME());
    SELECT 
        DATEDIFF( millisecond, @date1, @date2 ) AS DATEDIFF,
        DATEDIFF_BIG( millisecond, @date1, @date2 ) AS DATEDIFF_BIG;

    結果:

    DATEDIFF  DATEDIFF_BIG
    --------  ------------
    1000      1000        
    

    予想どおり、両方の関数は同じ結果を返します。これは、戻り値が bigintの両方に対応できるほど小さいためです。 およびint データ型。 1秒間にミリ秒数を返すだけでした。

    異なる結果

    さて、期間を1000年に延長するとどうなりますか。

    まず、DATEDIFF()を使用するとどうなりますか。 :

    DECLARE @date1 datetime2 = SYSDATETIME();
    DECLARE @date2 datetime2 = DATEADD(year, 1000, SYSDATETIME());
    SELECT DATEDIFF( millisecond, @date1, @date2 ) AS DATEDIFF;

    結果:

    Error: 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.
    

    さて、これがDATEDIFF_BIG()の方法です 処理:

    DECLARE @date1 datetime2 = SYSDATETIME();
    DECLARE @date2 datetime2 = DATEADD(year, 1000, SYSDATETIME());
    SELECT DATEDIFF_BIG( millisecond, @date1, @date2 ) AS DATEDIFF_BIG;

    結果:

    DATEDIFF_BIG  
    --------------
    31556908800000
    

    int には、1000年のミリ秒数を返すのは多すぎました 、ただし、 bigintの場合は問題ありません 。


    1. 奇妙なSQLAlchemyエラーメッセージ:TypeError:'dict'オブジェクトはインデックス作成をサポートしていません

    2. .NET 4:Web.Configの他のアセンブリでEDMXファイルを構成する方法

    3. 関数を作成せずにSQLServerで区切り文字列を分割するにはどうすればよいですか?

    4. OracleのNLS_INITCAP()関数