Cela continue de 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 versions ultérieures, c'est simple:
cast(getDate() As Date)
Notez que les trois derniers paragraphes près du bas s'appliquent toujours, et vous devez souvent prendre du recul et trouver un moyen d'éviter la distribution en premier lieu.
Mais il existe également d'autres moyens d'y parvenir. Voici les plus courants.
La bonne façon (nouveau depuis Sql Server 2008):
cast(getdate() As Date)
La bonne façon (ancienne):
dateadd(dd, datediff(dd,0, getDate()), 0)
C'est plus ancien maintenant, mais cela vaut toujours la peine d'être connu, car il peut également s'adapter facilement à d'autres moments, comme le premier moment du mois, des minutes, des heures ou de l'année.
Cette manière correcte utilise des fonctions documentées qui font partie de la norme ansi et sont garanties de fonctionner, mais cela peut être un peu plus lent. Il fonctionne en recherchant combien de jours il y a du jour 0 au jour actuel, et en ajoutant ce nombre de jours au jour 0. Il fonctionnera quelle que soit la façon dont votre datetime est stockée et quels que soient vos paramètres régionaux.
La voie rapide:
cast(floor(cast(getdate() as float)) as datetime)
Cela fonctionne car les colonnes datetime sont stockées en tant que valeurs binaires de 8 octets. Castez-les pour flotter, fixez-les au sol pour supprimer la fraction et la partie temporelle des valeurs disparaît lorsque vous les restituez à datetime. C'est juste un peu de décalage 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. Dans la pratique, il est très peu probable que cette implémentation change de sitôt, mais il est toujours important d'être conscient du danger si vous choisissez de l'utiliser. Et maintenant que nous avons la possibilité de caster comme date, c'est rarement nécessaire.
La mauvaise direction:
cast(convert(char(11), getdate(), 113) as datetime)
La mauvaise façon fonctionne en convertissant en chaîne, en tronquant la chaîne et en reconvertissant en date / heure. C'est faux , pour deux raisons: 1) cela pourrait ne pas fonctionner dans tous les environnements locaux et 2) il s'agit de la manière la plus lente de le faire ... et pas seulement un peu; c'est comme un ordre de grandeur ou deux plus lent que les autres options.
Mise à jour Cela a obtenu des votes récemment, et je veux donc ajouter que depuis que j'ai posté cela, j'ai vu des preuves assez solides que Sql Server optimisera la différence de performances entre la manière "correcte" et la méthode "rapide" , ce qui signifie que vous devriez maintenant privilégier le premier.
Dans les deux cas, vous souhaitez écrire vos requêtes pour éviter d'avoir à le faire en premier lieu . Il est très rare que vous effectuiez ce travail sur la base de données.
Dans la plupart des endroits, la base de données est déjà votre goulot d'étranglement. C'est généralement le serveur qui est le plus cher à ajouter du matériel pour améliorer les performances et le plus difficile à faire pour que ces ajouts soient corrects (vous devez équilibrer les disques avec la mémoire, par exemple). C'est aussi le plus difficile à étendre vers l'extérieur, à la fois techniquement et d'un point de vue commercial; techniquement, il est beaucoup plus facile 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 20 000 $ + par licence de serveur pour IIS ou apache.
Le point que j'essaie de faire est que chaque fois que possible, vous devriez faire ce travail au niveau de l'application. La seule fois où vous devriez vous retrouver à tronquer une date / heure sur Sql Server est lorsque vous devez effectuer un regroupement par jour, et même dans ce cas, vous devriez probablement avoir une colonne supplémentaire configurée en tant que colonne calculée, maintenue au moment de l'insertion / mise à jour ou maintenue. dans la logique d'application. Obtenez ce travail révolutionnaire et gourmand en CPU de votre base de données.