Question Meilleure approche pour supprimer la partie temporelle de datetime dans SQL Server


Quelle méthode fournit les meilleures performances lors de la suppression de la partie de temps d'un champ datetime dans SQL Server?

a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

ou

b) select cast(convert(char(11), getdate(), 113) as datetime)

La deuxième méthode envoie un peu plus d'octets dans les deux sens, mais cela pourrait ne pas être aussi important que la vitesse de la conversion.

Les deux semblent également être très rapide, mais il pourrait y avoir une différence de vitesse lorsqu'il s'agit de centaines de milliers de lignes ou plus?

Aussi, est-il possible qu'il existe des méthodes encore meilleures pour se débarrasser de la partie temps d'un datetime en SQL?


444
2017-07-24 12:49


origine


Réponses:


Strictement, méthode a est la moins gourmande en ressources:

a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

Prouvé moins intensif CPU pour la même durée totale d'un million de lignes par quelqu'un avec beaucoup trop de temps sur leurs mains: Le moyen le plus efficace dans SQL Server d'obtenir la date à partir de la date et l'heure?

J'ai vu un test similaire ailleurs avec des résultats similaires.

Je préfère le DATEADD / DATEDIFF car:

Modifier, octobre 2011

Pour SQL Server 2008+, vous pouvez faire CAST pour date. Ou simplement utiliser date donc pas le temps d'enlever.

Edit, janvier 2012

Un exemple de flexibilité: Besoin de calculer par heure arrondie ou date figure dans le serveur SQL

Edit, mai 2012

N'utilisez pas ceci dans les clauses WHERE et autres sans y penser: ajouter une fonction ou CAST à une colonne invalide l'utilisation de l'index. Voir le numéro 2 ici: http://www.simple-talk.com/sql/t-sql-programming/ten-common-sql-programming-mistakes/

Maintenant, cela a un exemple de versions ultérieures de l’optimiseur SQL Server qui gèrent correctement CAST, mais généralement ce sera une mauvaise idée ...


472
2017-07-24 13:09



Dans SQL Server 2008, vous pouvez utiliser:

CONVERT(DATE, getdate(), 101)

51
2017-10-23 12:33



Bien sûr, c'est un vieux fil mais pour le rendre complet.

A partir de SQL 2008, vous pouvez utiliser le type de données DATE pour pouvoir simplement:

SELECT CONVERT(DATE,GETDATE())

32
2018-05-04 15:00



SELECT CAST(FLOOR(CAST(getdate() AS FLOAT)) AS DATETIME)

19
2017-07-24 12:57



Dans SQL Server 2008, il existe un type de données DATE (également un type de données TIME).

CAST(GetDate() as DATE)

ou

declare @Dt as DATE = GetDate()

11
2018-04-03 22:54



Voici encore une autre réponse, d'un autre question en double:

SELECT CAST(CAST(getutcdate() - 0.50000004 AS int) AS datetime) 

Cette méthode des nombres magiques est légèrement plus rapide que la méthode DATEADD. (Il ressemble à ~ 10%)

Le temps CPU sur plusieurs tours d'un million d'enregistrements:

DATEADD   MAGIC FLOAT
500       453
453       360
375       375
406       360

Mais notez que ces chiffres sont peut-être hors de propos car ils sont déjà très rapides. À moins d'avoir des ensembles d'enregistrements de 100 000 ou plus, je n'ai même pas pu lire le temps CPU au-dessus de zéro.

Compte tenu du fait que DateAdd est destiné à cette fin et est plus robuste, je dirais utiliser DateAdd.


8
2017-07-24 14:20



SELECT CAST(CAST(GETDATE() AS DATE) AS DATETIME)

4
2017-07-03 13:38



Dénudez les insertions / mises à jour en premier lieu. Comme pour la conversion à la volée, rien ne peut battre une fonction définie par l'utilisateur:

select date_only(dd)

L'implémentation de date_only peut être tout ce que vous voulez - maintenant, il est extrait et le code d’appel est beaucoup plus propre.


2
2017-07-24 12:55



Voir cette question:
Comment puis-je tronquer un datetime dans SQL Server?

Quoi que vous fassiez, n'utilisez pas la méthode de chaîne. C'est à peu près la pire façon de le faire.


2
2017-07-24 13:33



Déjà répondu mais mal jeter là aussi ... cela se prépare également bien mais il fonctionne en jetant la décimale (qui stocke le temps) du flotteur et en retournant seulement la partie entière (qui est la date)

 CAST(
FLOOR( CAST( GETDATE() AS FLOAT ) )
AS DATETIME
)

deuxième fois j'ai trouvé cette solution ... j'ai attrapé ce code 


2
2017-07-09 16:06



CAST(round(cast(getdate()as real),0,1) AS datetime)

Cette méthode n'utilise pas de fonction de chaîne. Date est fondamentalement un type de données réel avec des chiffres avant que les décimales ne soient une fraction de jour.

Je suppose que ce sera plus rapide que beaucoup.


2
2017-11-18 12:57