42 votes

HOWTO - Comparer une chaîne de date datetime de SQL Server?

Dans SQL Server, j'ai une colonne DATETIME qui comprend un élément de temps.

Exemple:

'14 AUG 2008 14:23:019'

Quelle est la meilleure méthode pour sélectionner uniquement les enregistrements pour un jour particulier, en ignorant le temps de la partie?

Exemple: (Pas sûr, car il ne correspond pas au temps de la partie et ne retourne aucune ligne)

DECLARE  @p_date DATETIME
SET      @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )

SELECT   *
FROM     table1
WHERE    column_datetime = @p_date

Note: compte tenu de ce site est aussi à propos de griffonner des notes et des techniques de ramasser et de l'oublier, je vais poster ma propre réponse à cette question DATETIME trucs dans MSSQL est probablement le sujet que je recherche le plus dans SQLBOL.


Mise à jour Précisé exemple pour être plus précis.


Edit Désolé, Mais j'ai eu de mod de MAUVAISES réponses (réponses à la question que le retour de mauvais résultats).

@Jorrit: WHERE (date>'20080813' AND date<'20080815') sera de retour le 13 et le 14.

@wearejimbo: Fermer, mais pas de cigare! insigne décerné à vous. Vous avez manqué les enregistrements écrits à 14/08/2008 à 23:59:001 à 23:59:999 (soit Moins de 1 seconde avant minuit.)

36voto

Guy Points 5465

Technique 1:

 DECLARE @p_date DATETIME
 SET     @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )

 SELECT  *
 FROM    table1
 WHERE   column_datetime >= @p_date
 AND     column_datetime < DATEADD(d, 1, @p_date)

L'avantage, c'est qu'il va utiliser un index sur "column_datetime" si elle existe.

17voto

vzczc Points 4923

Dans SQL Server 2008, vous pouvez utiliser le nouveau type de données de DATE

DECLARE @pDate DATE='2008-08-14'  

SELECT colA, colB
FROM table1
WHERE convert(date, colDateTime) = @pDate

@Guy. Je pense que vous trouverez que cette solution évolue très bien. Jetez un oeil au plan d'exécution de requête de la requête initiale.

Et pour la mienne:

8voto

Yaakov Ellis Points 15470

Il suffit de comparer l'année, le mois et le jour.

Declare @DateToSearch DateTime
Set @DateToSearch = '14 AUG 2008'

SELECT * 
FROM table1
WHERE Year(column_datetime) = Year(@DateToSearch)
      AND Month(column_datetime) = Month(@DateToSearch)
      AND Day(column_datetime) = Day(@DateToSearch)

4voto

ila Points 2507

Quelque chose comme cela?

SELECT  *
FROM    table1
WHERE   convert(varchar, column_datetime, 111) = '2008/08/14'

4voto

Guy Points 5465

Technique 2:

DECLARE @p_date DATETIME
SET     @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )

SELECT  *
FROM    table1
WHERE   DATEDIFF( d, column_datetime, @p_date ) = 0

Si le column_datetime champ n'est pas indexé, et il est peu probable d'être (ou de l'indice est peu susceptible d'être utilisé), puis à l'aide de DATEDIFF() est plus courte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X