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

GETDATE()とSYSDATETIME()のミリ秒単位のDatediffが常に異なるのはなぜですか?

    これらは、2つの異なる時間を返すことができる2つの異なる関数呼び出しです。

    さらに、GETDATE datetimeを返します SYSDATETIME()に対して、精度が3〜4ミリ秒しかないデータ型 datetime2(7)を返します データ・タイプ。

    両方の呼び出しがまったく同時に返される場合でも、丸めが原因で発生している問題が発生する可能性があります。

    DECLARE @D1 DATETIME2 = '2012-08-18 10:08:40.0650000'
    DECLARE @D2 DATETIME = @D1 /*Rounded to 2012-08-18 10:08:40.067*/
    SELECT DATEDIFF(ms, @D1 , @D2) /*Returns 2*/
    

    GETDATE()で置き換えると、もう1つの答えは正しくありません。 以下からわかるように、この関数は1回だけ呼び出されます。

    WHILE DATEDIFF(ms, GETDATE() , GETDATE()) = 0 
    PRINT 'This will not run in an infinite loop'
    

    GETDATE()を使用してWindowsXPデスクトップでループを実行する場合 およびSYSDATETIME しかし、他の何かが起こっている可能性があることを示す結果も見ることができます。おそらく別のAPIを呼び出しています。

    CREATE TABLE #DT2
      (
         [D1] [DATETIME2](7),
         [D2] [DATETIME2](7)
      )
    
    GO
    
    INSERT INTO #DT2
    VALUES(Getdate(), Sysdatetime())
    
    GO 100
    
    SELECT DISTINCT [D1],
                    [D2],
                    Datediff(MS, [D1], [D2]) AS MS
    FROM   #DT2
    
    DROP TABLE #DT2 
    

    以下の結果の例

    +-----------------------------+-----------------------------+-----+
    |             D1              |             D2              | MS  |
    +-----------------------------+-----------------------------+-----+
    | 2012-08-18 10:16:03.2500000 | 2012-08-18 10:16:03.2501680 |   0 |
    | 2012-08-18 10:16:03.2530000 | 2012-08-18 10:16:03.2501680 |  -3 |
    | 2012-08-18 10:16:03.2570000 | 2012-08-18 10:16:03.2501680 |  -7 |
    | 2012-08-18 10:16:03.2600000 | 2012-08-18 10:16:03.2501680 | -10 |
    | 2012-08-18 10:16:03.2630000 | 2012-08-18 10:16:03.2501680 | -13 |
    | 2012-08-18 10:16:03.2630000 | 2012-08-18 10:16:03.2657914 |   2 |
    | 2012-08-18 10:16:03.2670000 | 2012-08-18 10:16:03.2657914 |  -2 |
    | 2012-08-18 10:16:03.2700000 | 2012-08-18 10:16:03.2657914 |  -5 |
    | 2012-08-18 10:16:03.2730000 | 2012-08-18 10:16:03.2657914 |  -8 |
    | 2012-08-18 10:16:03.2770000 | 2012-08-18 10:16:03.2657914 | -12 |
    | 2012-08-18 10:16:03.2800000 | 2012-08-18 10:16:03.2814148 |   1 |
    +-----------------------------+-----------------------------+-----+
    

    関心のある行は

    です。
    | 2012-08-18 10:16:03.2600000 | 2012-08-18 10:16:03.2501680 | -10 |
    | 2012-08-18 10:16:03.2630000 | 2012-08-18 10:16:03.2501680 | -13 |
    

    この不一致は大きすぎて丸めの問題にはならず、GETDATEの複数の行に問題が存在するため、2つの関数の呼び出し間の遅延を伴うタイミングの問題だけではありません。 レポート10:16:03.26X 一方、SYSDATETIME レポート10:16:03.250



    1. ランダムな単純クエリでのクエリ中にMySQLサーバーへの接続が失われました

    2. C#NHibernateおよびOracleマネージドクライアント

    3. 従来のASP、MySQL、またはODBCUTF8エンコーディング

    4. mysql_connect()が空の警告で失敗する