Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment puis-je tronquer une date/heure dans SQL Server ?

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 le plâtre en premier lieu.

Mais il existe également d'autres moyens d'y parvenir. Voici les plus courants.

La bonne méthode (nouveau depuis Sql Server 2008) :

cast(getdate() As Date)

La manière correcte (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 aussi facilement s'adapter à d'autres moments, comme le premier moment du mois, de la minute, de l'heure ou de l'année.

Cette manière correcte utilise des fonctions documentées qui font partie de la norme ansi et dont le fonctionnement est garanti, mais cela peut être un peu plus lent. Cela 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. Cela fonctionnera quelle que soit la façon dont votre date/heure est stockée et quelle que soit votre région.

Le moyen le plus rapide :

cast(floor(cast(getdate() as float)) as datetime)

Cela fonctionne car les colonnes datetime sont stockées sous forme de valeurs binaires de 8 octets. Lancez-les pour flotter, plancher pour supprimer la fraction, et la partie temporelle des valeurs disparaît lorsque vous les renvoyez à datetime. Tout est juste un peu décalé sans logique compliquée et c'est très vite.

Sachez que cela dépend d'un détail d'implémentation que Microsoft est libre de modifier à tout moment, même lors d'une mise à jour automatique du service. Ce n'est pas non plus très portable. En pratique, il est très peu probable que cette implémentation change de si tô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 lancer un rendez-vous, c'est rarement nécessaire.

Dans le mauvais sens :

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

La mauvaise méthode 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 peut ne pas fonctionner dans tous les paramètres régionaux et 2) il s'agit de la manière la plus lente possible de le faire... et pas seulement un peu ; c'est comme un ordre de grandeur ou deux plus lent que les autres options.

Mettre à jour Cela a reçu des votes ces derniers temps, et je veux donc ajouter que depuis que j'ai posté ceci, j'ai vu des preuves assez solides que Sql Server optimisera la différence de performances entre la manière "correcte" et la manière "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 fassiez 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 auquel il est le plus coûteux d'ajouter du matériel pour améliorer les performances et le plus difficile pour obtenir ces ajouts correctement (vous devez équilibrer les disques avec la mémoire, par exemple). C'est aussi le plus difficile à faire évoluer vers l'extérieur, à la fois techniquement et d'un point de vue commercial; il est techniquement 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 plus de 20 000 $ par licence de serveur pour IIS ou apache.

Le point que j'essaie de faire valoir est que, dans la mesure du possible, vous devez effectuer ce travail au niveau de l'application. Le seul le moment où vous devriez vous retrouver à tronquer une date/heure sur Sql Server est le moment où vous devez regrouper 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/de la mise à jour ou maintenue dans l'application logique. Débarrassez-vous de votre base de données de ce travail de rupture d'index et gourmand en ressources processeur.