web-dev-qa-db-fra.com

Date et heure dans la clause where

Comment sélectionner 12/20/2008 dans where clause de SQL?

Le serveur est SQL Server 2005.

select * from tblErrorLog
where errorDate = '12/20/2008'
51
Novice Developer
WHERE datetime_column >= '20081220 00:00:00.000'
  AND datetime_column < '20081221 00:00:00.000'
72
LukeH

Tout d'abord, je vous recommande d'utiliser le format standard date/heure ISO-8601 - cela fonctionne quels que soient les paramètres de langue et de région définis sur votre serveur SQL. ISO-8601 est le format YYYYMMDD - pas d'espaces, pas de tirets - juste les données:

select * from tblErrorLog
where errorDate = '20081220'

Deuxièmement, vous devez savoir que SQL Server 2005 DATETIME inclut toujours une heure. Si vous recherchez une correspondance exacte avec la partie de date uniquement, vous obtiendrez uniquement les lignes correspondant à l'heure 00:00:00 - rien d'autre.

Vous pouvez utiliser l'une des requêtes de plage recommandées mentionnées ou dans SQL Server 2008, vous pouvez utiliser la date-heure DATE uniquement - ou vous pouvez effectuer une vérification, par exemple:

select * from tblErrorLog
where DAY(errorDate) = 20 AND MONTH(errorDate) = 12 AND YEAR(errorDate) = 2008

Celui qui vous convient le mieux.

Si vous devez souvent faire cette requête, vous pouvez soit essayer de normaliser le DATETIME pour n’inclure que la date, soit ajouter des colonnes calculées pour le jour, le mois et l’année:

ALTER TABLE tblErrorLog
   ADD ErrorDay AS DAY(ErrorDate) PERSISTED
ALTER TABLE tblErrorLog
   ADD ErrorMonth AS MONTH(ErrorDate) PERSISTED
ALTER TABLE tblErrorLog
   ADD ErrorYear AS YEAR(ErrorDate) PERSISTED

et alors vous pourriez interroger plus facilement:

select * from tblErrorLog
where ErrorMonth = 5 AND ErrorYear = 2009

et ainsi de suite. Étant donné que ces champs sont calculés et PERSISTED, ils sont toujours à jour et toujours à jour, et puisqu'ils sont affichés, vous pouvez même les indexer si nécessaire.

24
marc_s

Vous ne dites pas quelle base de données vous utilisez mais dans MS SQL Server ce serait

WHERE DateField = {d '2008-12-20'}

S'il s'agit d'un champ d'horodatage, vous aurez besoin d'une plage:

WHERE DateField BETWEEN {ts '2008-12-20 00:00:00'} AND {ts '2008-12-20 23:59:59'}
15
J__

En supposant que nous parlons de SQL Server DateTime

Remarque: BETWEEN inclut les deux extrémités de la plage, donc techniquement, ce modèle sera erroné:

errorDate BETWEEN '12/20/2008' AND '12/21/2008'

Ma méthode préférée pour une plage de temps comme celle-ci est:

'20081220' <= errorDate AND errordate < '20081221'

Fonctionne avec les index courants (balayage de plage, SARGable, sans fonction) et coupe correctement le lendemain à minuit, sans compter sur la granularité temporelle de SQL Server (par exemple 23: 59: 59.997).

7
onupdatecascade

Utilisez une fonction de conversion pour obtenir toutes les entrées d'un jour particulier.

Select * from tblErrorLog where convert(date,errorDate,101) = '12/20/2008'

Voir CAST and CONVERT pour plus d'informations

5
Middletone
select * from tblErrorLog
where errorDate BETWEEN '12/20/2008' AND DATEADD(DAY, 1, '12/20/2008')
1
Meff