554 votes

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

La méthode qui fournit les meilleures performances lors de la suppression de la partie heure à partir d'un champ datetime de SQL Server?

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

ou

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

La deuxième méthode est un peu plus d'octets de toute façon, mais qui pourrait ne pas être aussi important que la vitesse de la conversion.

Les deux semblent être de très rapide, mais il peut y avoir une différence de vitesse lorsque vous traitez avec des centaines de milliers ou plus de lignes?

Aussi, est-il possible qu'il existe de meilleures méthodes pour se débarrasser de la partie heure de datetime de SQL?

587voto

gbn Points 197263

Rigueur, méthode a est le moins gourmand en ressource:

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

Avéré moins consommateur d'UC pour la même durée totale d'un million de lignes par quelqu'un avec beaucoup trop de temps sur leurs mains: le moyen le Plus efficace dans SQL Server pour obtenir la date à partir de la date+l'heure?

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

Je préfère le DATEADD/DATEDIFF parce que:

  • varchar est soumise à la langue/dateformat questions
    Exemple: Pourquoi est mon CAS, l'expression non-déterministe?
  • flotteur s'appuie sur la mémoire de stockage interne
  • il s'étend à travailler sur premier jour de ce mois, demain etc en changeant le "0" de la base de

Edit, Oct 2011

Pour SQL Server 2008+, vous pouvez lancer à l' date. Ou simplement l'utiliser date donc pas de temps pour l'enlever.

Edit, Jan 2012

Un exemple de la façon flexible, c'est: Besoin de calculer arrondie de l'heure ou de la date figure dans sql server

Edit, Mai 2012

Ne pas utiliser dans les clauses where et comme sans y penser: ajout d'une fonction ou d'une FONTE d'une colonne invalide l'utilisation des index. Voir le numéro 2 ici: http://www.simple-talk.com/sql/t-sql-programming/ten-common-sql-programming-mistakes/

Maintenant, cela ne veut avoir un exemple de SQL Server optimiser la gestion des versions de FONTE à jour correctement, mais généralement ça sera une mauvaise idée ...

75voto

Anto Raja Prakash Points 449

Dans SQL2008, vous pouvez utiliser:

 CONVERT(DATE,getdate(), 101)
 

61voto

Arjan Fraaij Points 31

Bien sur c'est un vieux fil mais pour le rendre complet.

À partir de SQL 2008, vous pouvez utiliser le type de données DATE, vous pouvez donc simplement faire: SELECT CONVERT (DATE, GETDATE ())

20voto

Gary McGill Points 8009
SELECT CAST(FLOOR(CAST(getdate() AS FLOAT)) AS DATETIME)

8voto

Jeff Meatball Yang Points 12021

Voici encore une autre réponse, à partir d'un autre double question:

SELECT CAST(CAST(getutcdate() - 0.50000004 AS int) AS datetime)

Ce nombre magique méthode effectue légèrement plus vite que le DATEADD méthode. (Il ressemble à ~10%)

Le Temps de calcul sur plusieurs tours d'un million d'enregistrements:

DATEADD   MAGIC FLOAT
500       453
453       360
375       375
406       360

Mais notez que ces chiffres sont probablement pas pertinentes parce qu'elles sont déjà TRÈS rapide. Si je n'avais pas d'enregistrement de 100 000 habitants ou plus, je ne pouvais même pas eu le Temps de calcul de lire au-dessus de zéro.

Compte tenu du fait que DateAdd est destiné à cet effet et est plus robuste, je dirais que l'utilisation DateAdd.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X