2009-03-27 15 views
3

Je veux enregistrer mes dates dans sql2005 comme dates (sans heure minutes et secondes). Je veux faire cela parce que la fonction between n'est pas toujours correcte si les heures, minutes et secondes sont remplies.Enregistrer DateTime dans mssql 2005 sans heures, minutes et secondes

mais ni datetime ni smalldatetime ne le permet, en 2008 vous avez la colonne Date qui peut le faire.

J'ai aussi trouvé cette question qui me aide mais je n'aime pas le casting pour exécuter mes requêtes: How to remove the time portion of a datetime value (SQL Server)?

+0

si vous BETWEENs ne fonctionne pas parce que le datetime a l'heure autre que 00: 00: 00.000, fixez les BETWEENS, pas les données! –

Répondre

7

La façon non-casting:

SET @d = DATEADD(dd, 0, DATEDIFF(dd, 0, @dt)) 

Cela ajoute le nombre de jours entre 0 et date à 0, ce qui dans le temps partiel à zéro.

Si cela est plus rapide que l'approche CAST explicite doit être testé. L'utilisation de 0 suggère qu'un casting implicite sera fait dans cette expression.

+1

@Sem La façon de lancer n'est PAS plus rapide. S'il vous plaît voir [ce poste pour plus de détails] (http://stackoverflow.com/questions/2775/whats-the-best-way-to-remove-the-time-portion-of-a-datetime-value-sql- serveur/3696991 # 3696991). – ErikE

+0

@Sem Pour ceux qui ont la chance d'être hors SQL 2005 ou même SQL 2000 ...:) – ErikE

+0

@Tomalak Je ne pense pas qu'une distribution implicite sur un littéral soit plus lente qu'une distribution explicite. – ErikE

0

Si tout ce que vous pouvez stocker le reste échoue comme une valeur entière de secondes à partir d'un point à l'heure. Cela vous permettra de le comparer à d'autres dates stockées de la même manière sans lancer.

+0

Il n'est pas nécessaire d'écrire un code complexe pour le faire - il suffit de lancer (DateTimeValue as int). –

0

Si vous travaillez dans .NET, vous pouvez utiliser

DateTime.Now.Date 

pour vous donner juste la partie date d'une valeur datetime.

+0

Oui, c'est juste. J'ai fait une grande supposition que cela pourrait convenir. –

1

Ce que vous pouvez faire est de vous assurer que les dates stockées n'ont pas de minutes et de secondes AVANT de les envoyer à la base de données. Cela devrait être assez simple à partir de votre code d'application si vous créez un datetime basé sur un datetime existant mais mettez les heures, minutes et secondes à zéro

0

BETWEENs ne fonctionnera pas car le datetime a un temps autre que 00: 00: 00.000 , donc fixez les BETWEENS, pas les données.

Ceci renverra toutes les données sur un seul jour, quel que soit le temps

DECLARE @FilterDate datetime 
SET @FilterDate='3/18/2009' 

QUERY 
    ... 
    WHERE Column1 >= @FilterDate AND Column1 < @FilterDate + 1 

Ceci renverra toutes les données sur une plage de dates, quel que soit le temps

DECLARE @StartFilterDate datetime 
DECLARE @EndFilterDate datetime 
SET @StartFilterDate ='3/18/2009' 
SET @EndFilterDate ='3/30/2009' 

QUERY 
    ... 
    WHERE Column1 >= @StartFilterDate AND Column1 < @EndFilterDate + 1 
0
SELECT CONVERT(DATETIME, CONVERT(DATE, GETDATE())) 
+0

Qu'est-ce que cela ajoute aux réponses actuelles? – Yaroslav

0

étage Date d'aujourd'hui et le temps est simple comme indiqué ci-dessous:

select DATEADD(dd, 0, DATEDIFF(dd, 0, getdate())) 
Questions connexes