【问题标题】:Comparing effective dates in SQL比较 SQL 中的生效日期
【发布时间】:2010-09-06 13:45:24
【问题描述】:

想知道当您需要查看有效开始日期和结束日期时,在选择记录的 WHERE 子句中是否有更好的原因?

目前这是我过去在 MS SQL Server 上的做法。只是担心日期而不是时间。我使用的是 SQL Server 2005。

AND Convert(datetime, Convert(char(10), ep.EffectiveStartDate, 101))
   <= Convert(datetime, Convert(char(10), GetDate(), 101))
AND Convert(datetime, Convert(char(10), ep.EffectiveEndDate, 101))
   >= Convert(datetime, Convert(char(10), GetDate(), 101))

【问题讨论】:

    标签: sql sql-server date sql-server-2005


    【解决方案1】:
    AND DateDiff(Day, 0, GetDate()) + 1 > ep.EffectiveStartDate
    AND DateDiff(Day, 0, GetDate()) < ep.EffectiveEndDate
    

    我认为您会发现这些条件提供了可能的最佳性能。这将愉快地利用索引。

    我也非常确定这是正确的,并且会提供正确的数据。不需要进一步计算没有时间部分的日期。

    【讨论】:

      【解决方案2】:

      @Darren Kopp - 你可以使用

      set @date2 = '20201001'
      

      这会让你失去演员表。

      footndale - 您也可以使用日期算术来删除时间。像

      select dateadd(d, datediff(d, 0, CURRENT_TIMESTAMP), 0)
      

      获取今天的日期(没有时间)。我相信这比来回投射更有效。

      【讨论】:

        【解决方案3】:

        @达伦·科普

        小心BETWEEN,查看How Does Between Work With Dates In SQL Server?

        【讨论】:

          【解决方案4】:

          这太糟糕了,看看Only In A Database Can You Get 1000% + Improvement By Changing A Few Lines Of Code 看看你可以如何优化它,因为这不是 sargable

          还可以查看 Get Datetime Without TimeQuery Optimizations With Dates

          【讨论】:

            【解决方案5】:

            试试

            ep.EffectiveStartDate BETWEEN @date1 AND @date2
            

            你会在哪里做类似的事情

            declare @date1 datetime, @date2 datetime;  
            set @date1 = cast('10/1/2000' as datetime)  
            set @date2 = cast('10/1/2020' as datetime)
            

            【讨论】:

            • 这与他的要求相差甚远。 EffectiveEndDate在哪里?
            猜你喜欢
            • 1970-01-01
            • 2015-12-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多