Sélectionnez à partir du tableau donné le jour

J'ai donc une table dans SQL Server avec une colonne datetime dessus. Je veux tout sélectionner dans cette table:

 select * from dbo.tblMessages 

mais je veux passer un paramètre datetime . Ensuite, je veux sélectionner tous les messages de la table qui ont le même day que la colonne datetime dans tblMessages , pas seulement ceux qui ont été postés au cours des dernières 24 heures, etc.

Comment ferais-je cela?

Merci.

Cela devrait utiliser un index sur MyDateTimeCol dans tblMessages

  select * from dbo.tblMessages WHERE MyDateTimeCol >= DATEADD(day, DATEDIFF(day, 0, @Mydatetimeparameter), 0) AND MyDateTimeCol < DATEADD(day, DATEDIFF(day, 0, @Mydatetimeparameter), 1) 

Toute fonction appliquée à MyDateTimeCol empêchera l'utilisation correcte d'un index, y compris DATEDIFF entre celui-ci et @Mydatetime

Comme vous êtes sur SQL Server 2008, vous pouvez simplement faire

 SELECT * FROM tblMessages WHERE CAST(message_date AS DATE) = CAST(@YourDateParameter AS DATE) 

C'est sargable. SQL Server appenda un ComputeScalar au plan qui appelle la fonction interne GetRangeThroughConvert et obtient le début et la fin de la plage à searchr.

Si vous avez besoin de faire cela beaucoup, et si vous êtes sur SQL Server 2005 ou plus récent, vous pouvez aussi faire ceci:

  • append trois colonnes calculées pour le jour, le mois, l'année de votre date et persister les

     ALTER TABLE dbo.YourTable ADD DayPortion AS DAY(YourDateTimeColumn) PERSISTED -- do the same for MONTH(YourDateTimeColumn) and YEAR(YourDateTimeColumn) 
  • mettre un index sur les trois colonnes:

     CREATE NONCLUSTERED INDEX IX_DatePortions ON dbo.tblMessages(YearPortion, MonthPortion, DayPortion) 
  • maintenant, vous pouvez searchr très facilement et rapidement pour ces jours, mois, année, et avec l'index, votre search sera très performante et rapide

     SELECT (list of columns) FROM dbo.tblMessages WHERE YearPortion = 2011 AND MonthPortion = 4 AND DayPortion = 17 

Avec cette configuration – trois colonnes persistantes calculées – vous pouvez maintenant simplement insert de nouvelles lignes dans la table – ces trois colonnes seront calculées automatiquement.

Comme ils sont persistants et indexés, vous pouvez également effectuer des searchs simples et très efficaces sur ces colonnes.

Et avec cette flexibilité, vous pouvez également find facilement toutes les lignes pour un mois ou une année donnés.