rudorufu1981
@rudorufu1981

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【SQL】GETDATE()の値が一致する条件を知りたいです!

■解決したいこと(気になること)

SQLServerで(他のSQLでもおそらく同様な気がしているのですが)、

  • GETDATE()で日時が一致する条件を知りたいです。
  • また、この動きはSQLServerの仕様なのでしょうか?
  • 仕様なのだとすれば、その仕様の背景についての一次ソースやわかりやすいサイト、などあれば教えていただきたいです。

※SQLServerのバージョンは、
Microsoft SQL Server Management Studio 18 です。


■具体例

test.sql
declare @x int = 0
declare @date1 datetime = GETDATE()
declare @date2 datetime
while @x <= 2000
    BEGIN 
            SET @x = @x + 1
            SET @date2 = GETDATE()
    END
select @date1,@date2

①ループが2000回 ⇒ GETDATE()の値は一致。

image.png

②ループが2100回 ⇒ GETDATE()の値が異なる。

image.png

①②より、
ループが2000回までは0.000秒差で、ループが100回分増えただけで0.003秒増えたとは考えにくいです。
⇒差が0.003秒以内なら同じ秒数とするというような内部処理がSQLServerの仕様で決まっている説?
ただし、そのような仕様が説明されたサイト等を見つけることができませんでした。。。


■考えたこと

はじめ、①ループが2000回の時もGETDATE()の値が異なると想定していました。
というのも、ループごとに現在の日時をセットしているため、2000回もループすれば0.001秒くらいずれるだろうと思っていました。
しかし①ループが2000回で動かしてみると、GETDATE()の値は一致しました。
次に、(同一ステートメントではないなら)GETDATE()の値は同じとSQLServerくんはみなす仕様なのかな?と仮説をたてて、ループが何回でもGETDATE()の値は一致になると想定しました。
しかし②ループが2100回で動かしてみると、GETDATE()の値は異なりました・・・
謎が深まるばかりです。。。


■自分で試したこと

一応、マイクロソフトさんの公式サイトを見ましたが求める内容は記載されていませんでした。

また、上記文章で「(同一ステートメントではないなら)」と記載したのは、
GOと書けば、GETDATE()の値が異なることは動かして確認しました。
image.png


よろしくお願いします!

0

1Answer

自己解決いたしました・・・!
他のSQLはわからないですが、SQLServerに限って言うと
GETDATE()の値が一致しているように見えたのは、丸められているからでした!!!​

ありがとうございました!

【SQL Server】DATETIME型の落とし穴

Microsoftの公式のDATETIME型のリファレンスによると、

時間の範囲 : 00:00:00 から 23:59:59.997
精度 : 値は、.000、.003、または .007 秒単位に丸められます。

0Like

Your answer might help someone💌