2010-08-24 8 views
1

Je peux facilement obtenir un enregistrement aléatoire d'aujourd'hui avec ceci:Sql Server 2005: les enregistrements aléatoires

SELECT * FROM MyTable ORDER BY NewId() 

Je peux facilement obtenir un enregistrement avec « date d'aujourd'hui » avec ceci:

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

Mais comment est-ce que je combinerais les deux?

Obtenez 1 enregistrement aléatoire ... n'importe quoi avec la date d'aujourd'hui.

Si aucun n'est trouvé ... obtenir 1 enregistrement aléatoire d'hier (aujourd'hui-1).

Si aucun ne trouve ... obtenir 1 enregistrement aléatoire de etc, etc, aujourd'hui-2

... jusqu'à 1 enregistrement est trouvé.

Répondre

2

Utilisez le TOP operator:

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

... combiné avec le ORDER BY NEWID(). Sans ORDER BY, vous obtiendrez généralement la première ligne/enregistrement insérée des enregistrements renvoyés par le filtrage dans la plupart des cas, mais la seule façon de garantir l'ordre est d'utiliser une clause ORDER BY. SQL Server 2005+ prend en charge les crochets sur la valeur TOP, de sorte que vous pouvez utiliser une variable entre parenthèses sans avoir besoin d'utiliser SQL dynamique.

+0

une meilleure implémentation de ce que j'allais faire. – DForck42

+0

Que faire si aucun enregistrement de "2010-24-08" dans le tableau comme mentionné dans la question. – Kashif

+0

@Muhammad Kashif Nadeem: Aucune ligne - 'TOP', comme MySQL et PostgreSQL' LIMIT', ne contraint que le nombre de lignes renvoyées par le resulset. –

6

Assurez la date de jour l'ordre primaire par condition:

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

Si vous stockez les dates que la journée et temps, vous devez les compléter à la partie de jour seulement: cast (Date as DATE) dans SQL 2008 ou cast(floor(cast(Date as FLOAT)) as DATETIME) en avant 2008.

1

Est-ce que cela vous donne ce que vous voulez?

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

Ceci suppose qu'il n'y a pas de date ultérieure à aujourd'hui.