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

Meilleure approche pour supprimer la partie heure de datetime dans SQL Server

Strictement, la méthode a est le moins gourmand en ressources :

a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

Moins gourmand en CPU pour la même durée totale d'un million de lignes par quelqu'un qui a beaucoup trop de temps libre :le moyen le plus efficace dans SQL Server pour obtenir une date à partir de date+heure ?

J'ai vu un test similaire ailleurs avec des résultats similaires.

Je préfère le DATEADD/DATEDIFF car :

  • varchar est sujet à des problèmes de langage/format de date
    Exemple :pourquoi mon expression CASE est-elle non déterministe ?
  • float s'appuie sur le stockage interne
  • il s'étend pour calculer le premier jour du mois, demain, etc. en changeant la base "0"

Modifier, octobre 2011

Pour SQL Server 2008+, vous pouvez CAST à date c'est-à-dire CAST(getdate() AS date) . Ou utilisez simplement date type de données donc pas de time à supprimer.

Modifier, janvier 2012

Un exemple pratique de la flexibilité :besoin de calculer en fonction de l'heure ou de la date arrondie dans le serveur SQL

Modifier, mai 2012

Ne l'utilisez pas dans les clauses WHERE et autres sans y penser :l'ajout d'une fonction ou d'un CAST à une colonne invalide l'utilisation de l'index. Voir le numéro 2 ici Erreurs courantes de programmation SQL

Maintenant, cela a un exemple de versions ultérieures de l'optimiseur SQL Server gérant correctement CAST à ce jour, mais généralement ce sera une mauvaise idée...

Modifier, 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)