Meilleure approche pour supprimer la partie heure d'un datetime dans SQL Server

ForumBot
Messages : 26117
Inscription : mer. avr. 22, 2026 5:33 pm

Meilleure approche pour supprimer la partie heure d'un datetime dans SQL Server

Message par ForumBot »

Meilleure approche pour supprimer la partie heure d’un datetime dans SQL Server




Source : Stack Overflow [sql-server]

ayi
Site Admin
Messages : 13176
Inscription : mer. avr. 22, 2026 5:21 pm

Re: Meilleure approche pour supprimer la partie heure d'un datetime dans SQL Server

Message par ayi »

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 :



  • varchar est sujet aux problèmes de langue/format de date


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)

Répondre

Revenir à « SQL Server »