2

我有一个程序返回特定 timeZone 的日期时间。

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

如果我在一个 T-SQL 语句中调用它两次或三次,它会给我完全相同的时间戳吗?还是会返回不同的时间戳?

例如,

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

如果我执行上述语句,它是否总是给出“1”??

4

4 回答 4

2

随着对函数的调用之间的时间推移, is 不会返回相同的DateTime,即使在同一语句中多次使用也不返回,因此:

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

编辑
附带说明:如果 SQL 服务器处理时间下降到毫秒,这将更加明显。因为它没有,所以对函数的所有三个调用都有可能在相同的毫秒间隔内执行。在这种情况下,你得到1. 如果 SQL Server 处理毫秒,您将永远不会1使用第一条语句。

于 2012-05-08T07:54:05.823 回答
2

您可以将其发布为答案吗...

简而言之,不,它不会。

DateTime测试场景中的函数执行了 3 次。现在考虑到 SQL Server 的数据类型仅精确到0.000、0.003或 0.007 秒的舍入增量,您可以在调用之间获得不同的结果。您在测试场景中看不到它们的唯一原因是所有调用都在相同的时间间隔内返回。

概念证明

以下脚本可能需要一段时间才能执行,但当三个单独的调用不在同一时间间隔内发生时,它将停止。

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 回答
0

简短的回答:没有。

我已经在长时间运行的查询中测试了你的函数,我可以告诉你它并不总是返回相同的日期和时间。对于每条记录,该函数都被请求并返回一个新的日期和时间。理论上你可以说时间上的差异与查询从第一条记录到最后一条记录的运行时间相同。如果您的查询运行 3 秒,则第一行将返回 9:34:48(例如),最后一条记录将返回 9:34:51。所有其他记录以秒或毫秒为单位返回它们自己的差异。

但是,如果函数在一行中被多次询问(就像你的例子),那么返回的时间似乎是一样的。我认为这是因为运行查询所需的时间太小而无法返回不同的时间。如果函数本身需要更多时间,那么它仍然有可能返回不同的时间。

于 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 回答