【问题标题】:SQL Query for lowest time rows最短时间行的 SQL 查询
【发布时间】:2010-02-01 17:19:28
【问题描述】:

我有一个包含一个 DateTime 列的表。我想找到时间最短的行,它们的时间超过了变量 myTime。 我怎样才能做到这一点? 什么样的索引会提高性能?

【问题讨论】:

  • 只有时间,日期和/或星期几无意义?
  • 在 SQL Server 中,DataTime 是一种同时具有日期和时间的类型。
  • 我认为您的意思是 DateTime,而不是 DataTime。
  • 不只是最低时间高于 myTime。
  • @Shayan:如果有两个相等的最低值怎么办?

标签: sql sql-server performance datetime


【解决方案1】:

使用 TOP (SQL Server 2000+)


SELECT t.*
  FROM TABLE t
 WHERE t.date_time_col = (SELECT TOP 1
                                 x.date_time_col
                            FROM TABLE x
                           WHERE CONVERT(hh, x.date_time_col, 8) < @myTime
                        ORDER BY x.date_time_col)

使用最小值


SELECT t.*
  FROM TABLE t
 WHERE t.date_time_col = (SELECT MIN(x.date_time_col)
                            FROM TABLE x
                           WHERE CONVERT(hh, x.date_time_col, 8) < @myTime)

两者都不会使用索引,假设 DATETIME 列上存在索引,因为使用了函数 - 正在更改数据类型。

【讨论】:

    【解决方案2】:
    SELECT DateTime1
    FROM Table1
    WHERE DateTime1 = (
        SELECT MIN(DateTime1)
        FROM Table1
        WHERE DateTime1 > @myTime);
    

    或:

    SELECT T1.DateTime1
    FROM Table1 AS T1
    JOIN (
        SELECT MIN(DateTime1) AS DateTime1
        FROM Table1
        WHERE DateTime1 > @myTime) AS T2
    ON T1.DateTime1 = T2.DateTime1;
    

    同时运行两者以查看哪个最快。在 DateTime1 上使用索引。

    测试数据以检查它是否有效:

    CREATE TABLE Table1 (DateTime1 NVARCHAR(100) NOT NULL);
    INSERT INTO Table1 (DateTime1) VALUES
    ('2010-02-01 17:53'),
    ('2010-02-01 17:55'),
    ('2010-02-01 17:55'),
    ('2010-02-01 17:56');
    

    【讨论】:

      【解决方案3】:

      然后是这样的......

      DECLARE @temp datetime
      
      SET @temp = (SELECT GETDATE())
      
      Select myCol from MyTable where MyColWithDate IN (SELECT top 1 MyCol, MyCol2 FROM MyTable WHERE MyColWithDate > @temp ORDER BY MyColWithDate ASC)
      

      或者我可能会选择 MIN

      Select myCol from MyTable where MyColWithDate IN (SELECT MIN(MycolWithDAte) FROM MyTable WHERE MyColWithDate > @temp GROUP BY MyColWithDate)
      

      【讨论】:

      • 但是这样效率低下。有什么内置方法吗?
      • 你看过OVER子句了吗? msdn.microsoft.com/en-us/library/ms189461.aspx
      • 为什么你说它效率低下?子查询执行一次并返回一个值,然后将其用于另一个查询。
      【解决方案4】:
      DECLARE @temp datetime
      
      SET @temp = (SELECT GETDATE())
      
      SELECT MyCol, MyCol2 FROM MyTable WHERE MyColWithDate > @temp ORDER BY MyColWithDate ASC
      

      关于它所依赖的索引,您能否告诉我们有关您正在尝试做什么的更多信息。 否则,您可以为上面的示例索引 MyColWithDate。

      【讨论】:

      • 我希望所有这些都用最少的时间。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多