2

特定のtimeZoneの日時を返す手順があります。

CREATE Function [dbo].GetMyDate()  
Returns DATETIME  
As  
Begin  
 Return DateAdd(Hour,1,GetUTCDATE())  
End  

1つのT-SQLステートメントで2〜3回呼び出すと、まったく同じタイムスタンプが表示されますか?または、異なるタイムスタンプを返しますか?

たとえば、

SELECT 1 FROM TABLE_A WHERE GetMyDate() between GetMyDate() AND GetMyDate()

上記のステートメントを実行すると、常に「1」が表示されますか?

4

4 に答える 4

2

回答として投稿できますか...

要するに、いいえ、そうはなりません。

テストシナリオの関数は 3 回実行されます。SQL Server のデータ型が .000、.003、または .007 秒の丸められた増分にDateTimeのみ正確であることを考慮すると、呼び出し間で異なる結果が得られる可能性があります。テストシナリオでそれらが表示されない唯一の理由は、すべての呼び出しが同じ時間間隔内に返されるためです。

コンセプトの証明

次のスクリプトは実行に時間がかかる場合がありますが、3 つの個別の呼び出しが同じ間隔内に発生しないと停止します。

SET NOCOUNT ON 
DECLARE @Var INTEGER = 1 
WHILE @Var = 1 
BEGIN 
  SELECT @Var = COUNT(*) 
  WHERE  dbo.GetMyDate() BETWEEN dbo.GetMyDate() AND dbo.GetMyDate()   

  SELECT @Var 
END
于 2012-05-08T08:17:22.940 に答える
2

関数の呼び出しの間に時間が経過するとDateTime、同じステートメント内で複数回使用された場合でも、 is は同じ を返しません。

SELECT 1 FROM TABLE_A WHERE GetMyDate() between GetMyDate() AND GetMyDate()

必ず 1 が返ってくるとは限りません。

ただし、次のようになります。

DECLARE @myDate DATETIME
SET @myDate = GetMyDate()

SELECT 1 FROM TABLE_A WHERE @myDate BETWEEN @myDate AND @myDate

EDIT
補足:SQLサーバーがミリ秒までの時間を処理した場合、これはより明白になります。そうではないため、関数への 3 つの呼び出しすべてが同じミリ秒間隔内で実行される可能性があります。その場合、 が得られ1ます。1SQL Server がミリ秒単位で処理した場合、最初のステートメントを使用することはできません。

于 2012-05-08T07:54:05.823 に答える
0

簡単な答え: いいえ。

実行時間の長いクエリで関数をテストしましたが、常に同じ日付と時刻が返されるとは限りません。レコードごとに関数が要求され、新しい日付と時刻が返されます。理論的には、時間の差は、最初のレコードから最後のレコードまでのクエリの実行時間と同じであると言えます。クエリが 3 秒間実行される場合、最初の行は (たとえば) 9:34:48 を返し、最後のレコードは 9:34:51 を返します。他のすべてのレコードは、秒またはミリ秒で独自の差を返します。

ただし、関数が1行で複数回質問された場合(例のように)、返される時間は同じようです。これは、クエリの実行にかかる時間が短すぎて別の時間を返すことができないためだと思います。関数自体に時間がかかる場合でも、異なる時間を返す可能性があります。

于 2012-05-08T07:45:02.253 に答える
0

この小さなプログラムは、実際の日時が異なることを示しています。まず、5 回の繰り返しの後、ミリ秒が異なります。apxの後。14000 ~ 15000 回の反復秒は異なります。したがって、関数の呼び出しの間にどれだけの処理が行われたかに応じて、異なる値が得られます。

declare @i  int 
set @i = 0
while (@i < 100000)
begin 
     set @i = @i + 1
     print convert(nvarchar(6), @i) + ' ' + convert(nvarchar(50),dbo.GetMyDate(), 121)

end
于 2012-05-08T07:45:28.430 に答える