【问题标题】:Sql Server 2005: Today's random recordsSql Server 2005:今天的随机记录
【发布时间】:2011-04-03 09:00:34
【问题描述】:

我可以很容易地得到一个随机记录:

SELECT *    FROM MyTable    ORDER BY NewId() 

我可以很容易地用“今天的日期”获得记录:

SELECT *    FROM MyTable    WHERE MyDate = "2010-24-08"  -- db doesn't store times

但是我该如何将两者结合起来呢?

获取 1 条随机记录...与今天日期相关的任何内容。

如果没有找到...从昨天 (today-1) 中获取 1 条随机记录。

如果没有找到...从 etc 等获取 1 条随机记录,等等,今天-2

...直到找到 1 条记录。

【问题讨论】:

    标签: sql sql-server sql-server-2005 random newid


    【解决方案1】:

    这能满足你的需求吗?

    SELECT TOP 1 *
    FROM MyTable
    ORDER BY MyDate desc, NewId()
    

    假设没有比今天晚的日期。

    【讨论】:

      【解决方案2】:

      只需按条件将日期作为主要顺序:

      select top(1) *
      from Table
      order by Date desc, newid();
      

      如果您将日期存储为全天时间,则只需将它们四舍五入到日期部分:SQL 2008 中的cast (Date as DATE) 或 2008 年之前的cast(floor(cast(Date as FLOAT)) as DATETIME)。 p>

      【讨论】:

        【解决方案3】:

        使用TOP operator

          SELECT TOP 1 *    
            FROM MyTable    
           WHERE MyDate = "2010-24-08" 
        ORDER BY NEWID() 
        

        ...结合ORDER BY NEWID()。如果没有 ORDER BY,通常在大多数情况下,您将获得过滤返回的记录的第一个插入行/记录,但确保顺序的唯一方法是使用 ORDER BY 子句。

        SQL Server 2005+ 支持在 TOP 值上使用括号,因此您可以在括号中使用变量,而无需使用动态 SQL。

        【讨论】:

        • 更好地实现我将要做的事情。
        • 如果问题中提到的表格中没有“2010-24-08”的记录怎么办。
        • @Muhammad Kashif Nadeem:没有行 - TOP,像 MySQL 和 PostgreSQL 的 LIMIT,只限制从结果集返回的行数。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-16
        • 1970-01-01
        • 2015-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多