【问题标题】:Selecting GETDATE() function twice in a select list-- same value for both?在选择列表中选择 GETDATE() 函数两次——两者的值相同?
【发布时间】:2010-10-29 22:28:13
【问题描述】:

我有一个SELECT 语句,它将GETDATE() 用于两个不同的列值。我想知道从本质上讲,同一个SELECT 中的这两个单独的函数调用是否每次都会返回相同的值?

【问题讨论】:

    标签: sql-server-2005 getdate


    【解决方案1】:

    不,它们不能保证每次都返回相同的值。对GetDate() 的每个单独引用都是一个运行时常量,并将在整个查询过程中保持其值...

    SELECT GETDATE()
    FROM large_table
    

    无论查询运行多长时间,都会在所有行中返回相同的值。

    但不能保证不同的引用具有相同的值。

    如下图所示

    SET NOCOUNT ON;
    
    DECLARE @T TABLE 
    (
    rownum INT IDENTITY(1,1) PRIMARY KEY,
    d1 DATETIME,
    d2 DATETIME
    )
    
    WHILE (5 > (SELECT COUNT(*) FROM @T WHERE d1 <> d2))
        BEGIN
        DELETE FROM @T WHERE d1 = d2
        INSERT INTO @T 
        SELECT GETDATE(),GETDATE()
        END
    
    SELECT * FROM @T
    

    示例结果

    rownum      d1                      d2
    ----------- ----------------------- -----------------------
    22381       2011-05-18 12:24:14.433 2011-05-18 12:24:14.437
    30912       2011-05-18 12:24:15.420 2011-05-18 12:24:15.423
    43234       2011-05-18 12:24:16.717 2011-05-18 12:24:16.720
    113360      2011-05-18 12:24:24.210 2011-05-18 12:24:24.213
    147855      2011-05-18 12:24:27.817 2011-05-18 12:24:27.820
    

    【讨论】:

      【解决方案2】:

      很抱歉,我只是想出了一个测试来证明它不会总是返回相同的值。它实际上确实被评估了两次,如果系统时钟恰好在这两次评估之间的时间内翻转,那么两次调用的时间可能会略有不同。

      但是,其他人说它不会每行评估一次是正确的:每列仅评估一次。

      Will GETUTCDATE() return the same value if used twice in the same statement?

      【讨论】:

        【解决方案3】:

        大多数系统函数是按查询而不是按行评估的,除了那些根据定义统计唯一的函数,例如NEWID()。这包括 RAND() 之类的东西(它不是唯一的,只是伪随机),除非使用 NEWID() 逐行随机播种。

        确定性与此评估无关,因为它意味着“对于任何给定的输入,输出都是相同的,与语言或 DMY/MDY 无关)

        这种“每次查询一次”评估当然是有意义的,尤其是对于GETDATE()

        如果我进行 10k 行更新,我希望每一行都具有相同的 GETDATE() 值。整个更新可能很容易花费 > 3.33 毫秒,而且我不希望在我的 10k 行中有不同的值。

        【讨论】:

        • 这将是每个函数一次查询,因此如果查询中有多个 GETDATE() 实例,每个实例都会导致调用 GETDATE() 函数。
        • @StriplingWarrior sqlfiddle.com/#!6/27bad6/1 另有说明,GETDATE() 每次查询运行一次
        • 好吧,我对执行计划的内部运作并不完全清楚。我完全可以理解为什么您会期望该示例显示 GETDATE() 被执行两次。但是,我猜它并没有达到您的预期。 sqlfiddle.com/#!6/27bad6/7/0 表明,即使没有延迟调用,GETDATE() 也会经常以不同的值结束。
        【解决方案4】:

        是的,它们将返回相同的日期和时间,精确到毫秒。

        SELECT GETDATE(), GETDATE()
        

        返回

        2010-10-29 15:34:06.353 2010-10-29 15:34:06.353
        

        我已经用 4000、GETDATE() 对此进行了测试,它们都返回相同的结果。

        【讨论】:

        • 这不是可靠的行为。看我的帖子。
        • 是的。正如我的回答所示,4,000 不足以可靠地看到这种行为。
        • -1 因为不幸的是这不正确,请参阅@MartinSmith 的回答
        猜你喜欢
        • 1970-01-01
        • 2018-07-09
        • 1970-01-01
        • 1970-01-01
        • 2013-05-02
        • 2014-05-04
        • 1970-01-01
        • 2014-07-14
        • 1970-01-01
        相关资源
        最近更新 更多