2009-12-30 5 views
1

J'ai champ datecreated dans un tableau. Il contient valeur « 2009-12-30 11: 47: 20: 297 » J'ai une requête comme ceci:Pour obtenir la date à partir datetime en SQL

select * 
    from table 
where DateCreated = getdate() 

Bien qu'une ligne existe avec la date d'aujourd'hui, je ne reçois pas cette ligne lors de l'exécution ci-dessus question. Quelqu'un peut-il aider?

+1

Peter Di Cecco réponse est le meilleur, il permet l'utilisation d'index. –

+0

Pouvez-vous marquer la version de SQL Server que vous utilisez, SQL 2008 ayant un type DATE dans lequel vous pouvez convertir. Merci –

Répondre

3

La raison pour laquelle votre requête ne renvoie pas la ligne attendue est parce que GETDATE() renvoie la partie date et heure au moment où la requête a été exécutée. La valeur de votre colonne DateCreated ne correspond pas à la partie heure, donc aucune ligne n'est retournée.

Il existe plusieurs façons de construire une requête afin qu'elle évalue la date en fonction du composant de date uniquement. Voici un exemple:

WHERE YEAR(datecreated) = YEAR(GETDATE()) 
    AND MONTH(datecreated) = MONTH(GETDATE()) 
    AND DAY(datecreated) = DAY(GETDATE()) 

La triste réalité est que toute requête en utilisant une fonction sur la colonne signifie que si un index existe sur la colonne, il ne peut pas être utilisé.

+0

mais vous pouvez faire les YEAR(), MONTH(), DAY() dans les colonnes calculées persistantes sur votre table, puis les index ..... –

+1

@marc_s: Cela ressemble à quelque chose que quelqu'un qui abuse de clés artificielles pourrait créer. (Pardon, je n'ai pas pu résister;)) ... Sérieusement, regardez la réponse de Peter Di Cecco - c'est la meilleure, offrant la possibilité d'utiliser des index. –

+0

@Craig: bien, ça dépend - si vous avez besoin de p. sélectionnez sur le mois plusieurs fois (pour les rapports mensuels, etc.), cela pourrait être une approche valide. –

3

Vous pouvez utiliser quelque chose comme ça avec Sql Server

CREATE FUNCTION [dbo].[udf_DateOnly](@DateTime DATETIME) 
RETURNS DATETIME 
AS 
BEGIN 
    RETURN DATEADD(dd,0, DATEDIFF(dd,0,@DateTime)) 
END 

Cette ligne

DATEADD(dd,0, DATEDIFF(dd,0,@DateTime)) 

dépouillera la date partie.

1

Vous pouvez convertir datetime une chaîne avec seulement la date en utilisant
CONVERT(varchar(8), GETDATE(), 112)

Si nécessaire, vous pouvez changer de nouveau à datetime et par conséquent, vous aurez un datetime avec les heures, minutes , secondes et millisecondes à zéro.

+0

Bien que cela fonctionne, je ne le recommanderais pas. Pour commencer, la manipulation de chaînes effectuée en interne réduit les performances. Mais plus important encore, il conduit les développeurs à certaines mauvaises habitudes et potentiellement dangereuses. –

+0

Certainement bon à savoir. Pouvez-vous également me dire quels sont les dangers potentiels liés à l'utilisation de cette approche? – Carlos

2

Le champ datetime inclut à la fois la date et l'heure, avec une précision de l'ordre de la milliseconde. Votre requête ne fonctionnera que si elle est la milliseconde exacte stockée dans la base de données.

Pour vérifier si elle est aujourd'hui, mais ignorer l'heure de la journée, vous pouvez vérifier une gamme comme celui-ci:

select * from table where 
DateCreated >= '2009-12-30' and 
DateCreated < '2009-12-31' 

Vous pouvez l'utiliser en conjonction avec une fonction qui convertit la date actuelle, comme Astander ou Khilon a posté. Voici un exemple complet utilisant la réponse d'Astander. De plus, comme le souligne Craig Young, cela fonctionnera avec les index.

select * from table where 
DateCreated >= DATEDIFF(dd,0,GETDATE()) and 
DateCreated < DATEDIFF(dd,0,GETDATE()) 
+1

+1: Juste pour souligner, la gamme doit être inclusive d'un côté et exclusive de l'autre. C'est à dire. > = et

+1

PS: Je préfère le mécanisme d'astander pour supprimer le temps du résultat 'GETDATE()'. C'est à dire. 'où DateCreated> = DATEDIFF (dd, 0, GETDATE()) et DateCreated

2

La solution la plus simple pourrait être: de

SELECT CAST(GETDATE() as DATE) 
+0

Oui, si vous utilisez SQL Server 2008 ou plus récent comme le type de données DATE ont été intruduced puis. –

Questions connexes