2010-08-24 6 views
1

я могу легко получить случайную запись с этим:Sql Server 2005: Сегодняшние случайные записи

SELECT * FROM MyTable ORDER BY NewId() 

Я могу легко получить запись с «сегодняшнего дня» с этим:

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

Но как я бы скомбинировал их?

Получить 1 случайную запись ... с сегодняшней датой.

Если ни один не найден, получите 1 случайную запись со вчерашнего дня (сегодня-1).

Если никто не нашел ... получить 1 случайную запись из т.д., и т.д., сегодня-2

... до 1 запись найдена.

ответ

2

Используйте 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+ поддерживает скобки в верхнем значении, поэтому вы можете использовать переменную в скобках без необходимости использования динамического SQL.

+0

Лучшая реализация того, что я собирался делать. – DForck42

+0

Что делать, если в таблице не упоминается запись «2010-24-08», как указано в вопросе. – Kashif

+0

@Muhammad Kashif Nadeem: Нет строк - 'TOP', как MySQL и PostgreSQL' LIMIT', только ограничивает количество строк, возвращенных из resulset. –

6

Просто сделайте дату дня основным заказа по условию:

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

Если хранить даты как полный рабочий день и времени, вам нужно округлить их только дневную часть: cast (Date as DATE) в SQL 2008 или cast(floor(cast(Date as FLOAT)) as DATETIME) до 2008 года.

1

Это дает вам то, что вы хотите?

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

Это предполагает, что нет дат позже, чем сегодня.