Meilleure approche pour supprimer la partie heure d’un datetime dans SQL Server
Source : Stack Overflow [sql-server]
Meilleure approche pour supprimer la partie heure d’un datetime dans SQL Server
Source : Stack Overflow [sql-server]
Strictement, la méthode a est la moins gourmande en ressources :
a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
Prouvée moins gourmande en CPU pour la même durée totale sur un million de lignes par quelqu’un qui avait vraiment trop de temps libre : La manière la plus efficace dans SQL Server d’obtenir une date à partir de date+heure ?
J’ai vu un test similaire ailleurs avec des résultats similaires aussi.
Je préfère DATEADD/DATEDIFF parce que :
Exemple : Pourquoi mon expression CASE est-elle non déterministe ?
float repose sur le stockage interne
cela s’étend pour calculer le premier jour du mois, demain, etc. en changeant la base « 0 »
Modification, octobre 2011
Pour SQL Server 2008+, vous pouvez faire un CAST vers date, c’est-à-dire CAST(getdate() AS date). Ou simplement utiliser le type de données date pour ne pas avoir de time à supprimer.
Modification, janvier 2012
Un exemple concret de la flexibilité de cette approche : Besoin de calculer par temps arrondi ou chiffre de date dans SQL Server
Modification, mai 2012
N’utilisez pas ceci dans les clauses WHERE et similaires sans réfléchir : ajouter une fonction ou un CAST à une colonne invalide l’utilisation de l’index. Voir le numéro 2 ici Erreurs courantes de programmation SQL
Cependant, ceci contient un exemple où les versions ultérieures de l’optimiseur SQL Server gèrent correctement le CAST vers date, mais en général ce sera une mauvaise idée…
Modification, septembre 2018, pour datetime2
DECLARE @datetime2value datetime2 = '02180912 11:45' --this is deliberately within datetime2, year 0218
DECLARE @datetime2epoch datetime2 = '19000101'
select DATEADD(dd, DATEDIFF(dd, @datetime2epoch, @datetime2value), @datetime2epoch)