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.