我有一个程序返回特定时区的日期时间。
CREATE Function [dbo].GetMyDate()
Returns DATETIME
As
Begin
Return DateAdd(Hour,1,GetUTCDATE())
End
如果我在ONE T-SQL语句中调用它两次或三次,它会给我完全相同的时间戳吗? 或者它会返回不同的时间戳吗?
例如,
SELECT 1 FROM TABLE_A WHERE GetMyDate() between GetMyDate() AND GetMyDate()
如果我执行上述声明, 总是 会给出“1”吗?
答案 0 :(得分: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
。
答案 1 :(得分:2)
你能把它作为答案发布......
简而言之,不,它不会。
testcenario中的函数执行三次。现在,如果SQL Server的DateTime
数据类型准确到Rounded increments of .000, .003, or .007 seconds,那么可以在调用之间获得不同的结果。您在testcenario中没有看到它们的唯一原因是因为所有调用都在相同的时间间隔内返回。
概念证明
以下脚本可能需要一段时间才能执行,但是当在同一时间间隔内没有发生三个单独的调用时它会停止。
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
答案 2 :(得分:0)
简短回答:不。
我在长时间运行的查询中测试了你的功能,我可以告诉你它并不总是返回相同的日期和时间。对于每个记录,请求该函数并返回新的日期和时间。从理论上讲,您可以说时间差异与从第一个记录到最后一个记录的查询运行时间相同。如果查询运行3秒,则第一行将返回9:34:48(例如),最后一条记录返回9:34:51。所有其他记录以秒或毫秒返回自己的差异。
但是,如果函数在一行中被多次询问(就像你的例子那样)那么返回的时间似乎是相同的。我认为这是因为运行查询所需的时间太小而无法返回不同的时间。如果函数本身需要更多时间,那么它仍然可能返回不同的时间。
答案 3 :(得分: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