2009-08-19 5 views
1

Le SQL ci-dessous retourne 0 enregistrements quand je sais qu'il y a des enregistrements qui correspondent - je pense que c'est la date qui me cause des problèmes.SQL renvoyant 0 enregistrements/date problème?

Voici le SQL:

exec sp_executesql N'SELECT * FROM [dbo].[QuizAnswersCompleted] 
WHERE [dbo].[QuizAnswersCompleted].[QuizProfileID] = @QuizProfileID0 
AND [dbo].[QuizAnswersCompleted].[DateCompleted] = @DateCompleted1 
',N'@QuizProfileID0 int,@DateCompleted1 datetime',@QuizProfileID0=31,@DateCompleted1='Aug 19 2009 4:29:03:000PM' 

Et voici une capture d'écran des enregistrements correspondant au DB:

alt text http://photos-d.ak.fbcdn.net/hphotos-ak-snc1/hs145.snc1/5371_117422998930_749683930_2374147_5891781_n.jpg

Qu'est-ce que je manque ici?

Répondre

2

avec la date/heure comme vous avez, il y a des fractions de seconde aussi, dans votre requête vous utilisez 'Aug 19 2009 4: 29: 03: 000PM', la capture d'écran montre seulement secondes. si vous voulez une correspondance exacte comme vous faites, vous devez savoir tout le temps:

select convert(char(23),YourDate,121) FROM YourTable 

essayer « plancher » date: Floor a date in SQL server

+0

Convenu. La résolution maximale d'un DateTime est de 3 millisecondes. Cela laisse environ 333 valeurs possibles entre 4: 29: 03: 000 et 4: 29: 04: 000. – Anon246

+1

L'exécution d'une fonction sur une colonne dans le cadre d'une clause where peut entraîner des performances de requête médiocres (sur des tables plus grandes), car le serveur ne pourra pas utiliser les statistiques ou les index pour la colonne. Bien qu'il semble un peu un hack, vous pouvez utiliser le prédicat: 'WHERE [DateCompleted] BETWEEN @date AND @ dateUpper' où @date est la date d'origine que vous recherchez, et @dateUpper est une date 999ms plus tard. –

+0

problème est le SQL est généré par SubSonic donc je ne peux pas ajuster la requête - je vais devoir trouver une solution différente qui n'utilise pas la date qui n'est pas un problème - merci pour toute l'aide! – Slee