Il continue à recueillir fréquemment des votes supplémentaires, même plusieurs années plus tard, et je dois donc le mettre à jour pour les versions modernes de Sql Server. Pour Sql Server 2008 et plus, c'est simple :
cast(getDate() As Date)
Notez que les trois derniers paragraphes vers le bas sont toujours d'actualité et que vous devez souvent prendre du recul pour trouver un moyen d'éviter le plâtre en premier lieu.
Mais il existe aussi d'autres moyens d'y parvenir. Voici les plus courantes.
La méthode correcte (nouvelle depuis Sql Server 2008) :
cast(getdate() As Date)
La manière correcte (ancienne) :
dateadd(dd, datediff(dd,0, getDate()), 0)
Cette méthode est plus ancienne aujourd'hui, mais elle mérite d'être connue car elle peut facilement s'adapter à d'autres moments, comme le premier moment du mois, de la minute, de l'heure ou de l'année.
Cette méthode correcte utilise des fonctions documentées qui font partie de la norme ansi et dont le fonctionnement est garanti, mais elle peut être un peu plus lente. Elle fonctionne en trouvant combien de jours il y a entre le jour 0 et le jour actuel, et en ajoutant ce nombre de jours au jour 0. Elle fonctionnera quelle que soit la façon dont votre date est stockée et quelle que soit votre locale.
La méthode rapide :
cast(floor(cast(getdate() as float)) as datetime)
Cela fonctionne parce que les colonnes de date sont stockées sous forme de valeurs binaires de 8 octets. Transformez-les en valeurs flottantes, mettez-les au plancher pour supprimer la fraction, et la partie temps des valeurs disparaît lorsque vous les retransformez en date. Ce n'est qu'un simple décalage de bits, sans logique compliquée, et c'est très rapide.
Sachez que cela repose sur un détail d'implémentation que Microsoft est libre de modifier à tout moment, même dans une mise à jour de service automatique. Ce n'est pas non plus très portable. En pratique, il est très peu probable que cette implémentation change prochainement, mais il est tout de même important d'être conscient du danger si vous choisissez de l'utiliser. Et maintenant que nous avons la possibilité d'utiliser une date, c'est rarement nécessaire.
Le mauvais chemin :
cast(convert(char(11), getdate(), 113) as datetime)
La mauvaise méthode consiste à convertir en une chaîne de caractères, à tronquer cette chaîne et à la reconvertir en date. C'est mauvais pour deux raisons : 1) il se peut que cela ne fonctionne pas dans toutes les régions et 2) c'est la façon la plus lente possible de faire cela... et pas seulement un peu ; c'est un ordre de grandeur ou deux plus lent que les autres options.
Mise à jour Ce sujet a reçu quelques votes dernièrement, et je veux donc ajouter que depuis que j'ai posté ce message, j'ai vu des preuves assez solides que Sql Server optimisera la différence de performance entre la manière "correcte" et la manière "rapide", ce qui signifie que vous devriez maintenant favoriser la première.
Dans les deux cas, vous voulez Rédigez vos requêtes pour éviter d'avoir à le faire en premier lieu. . Il est très rare que vous deviez effectuer ce travail sur la base de données.
Dans la plupart des cas, la base de données est déjà votre goulot d'étranglement. C'est généralement le serveur auquel il est le plus coûteux d'ajouter du matériel pour améliorer les performances et le plus difficile à mettre en place (vous devez équilibrer les disques et la mémoire, par exemple). C'est aussi le plus difficile à faire évoluer, à la fois d'un point de vue technique et d'un point de vue commercial ; il est beaucoup plus facile techniquement d'ajouter un serveur web ou d'application qu'un serveur de base de données et même si c'était faux, vous ne payez pas plus de 20 000 $ par licence de serveur pour IIS ou Apache.
Ce que je veux dire, c'est que, dans la mesure du possible, vous devez effectuer ce travail au niveau de l'application. Le site uniquement La seule fois où vous devriez avoir à tronquer une date sur Sql Server est lorsque vous avez besoin de regrouper par jour, et même dans ce cas, vous devriez probablement avoir une colonne supplémentaire configurée comme une colonne calculée, maintenue au moment de l'insertion/mise à jour, ou maintenue dans la logique de l'application. Débarrassez votre base de données de ce travail lourd en termes d'index et de processeur.