SQL Server : Conserver la date ou l’heure d’un datetime (Comparaison des méthodes v2)
Je relance un vieux billet (http://blogs.codes-sources.com/christian/archive/2007/04/29/sql-server-conserver-la-date-ou-l-heure-d-un-datetime-comparaison-des-methodes.aspx) sur le traitement des dates, essentiellement pour remettre ce banc d'essai à jour et ajouter les conversions spécifiques à SQL Server 2008.
La procédure de test vise à créer une table :
CREATE
TABLE DateTable
(X datetime)
GO
La remplir à 20 millions de lignes :
DECLARE @base_dte datetime
;
SET @base_dte =
'19000101'
;
DECLARE @I int
;
SET @I = 20000000 ;
WHILE
(@I > 0)
BEGIN
INSERT DateTable VALUES(DATEADD(MINUTE, @I, @base_dte))
SET @I = @I - 1 ;
END
Et tester avec les différentes commandes :
DECLARE @d datetime
;
SET
STATISTICS
TIME
ON
-- Les méthodes suivantes ne conservent que la composante heure
-- Se valent globalement toutes
SELECT @d =
cast(cast(X as
binary(4))
as
datetime)
FROM DateTable -- 5.5 sec
SELECT @d = X-datediff(day, 0, X)
FROM DateTable -- 5.3 sec
SELECT @d = X-cast(cast(X as
float)
as
int)
FROM DateTable -- 5.2 sec
-- 2008 uniquement
SELECT @d =
cast(X as
time)
FROM DateTable -- 4.7
-- Les méthodes suivantes ne conservent que la composante date
-- Lentes et à déconseiller
SELECT @d =
CONVERT(datetime,
CONVERT(char(10), X, 103), 103)
FROM dbo.DateTable -- 17 sec
SELECT @d =
DATEADD(d, 0,
FLOOR(CAST(X as
float)))
FROM dbo.DateTable -- 7 sec
SELECT @d =
CAST(FLOOR(CAST(X as
float))
as
datetime)
FROM dbo.DateTable -- 5.6 sec
-- TOP 4 -- Ces méthodes se valent dans la mesure où l'écart entre elle est faible !
SELECT @d =
CAST(CAST(CAST(X as
float)
as
int)
as
datetime)
FROM dbo.DateTable -- 4.7 sec
SELECT @d =
cast(cast(cast(X as
float)
as
int)
as
datetime)
FROM DateTable -- 4.7 sec
SELECT @d =
cast(datediff(day,0,X)
as
datetime)
FROM DateTable -- 4.5 sec
-- 2008 uniquement
SELECT @d =
CAST(X as
date)
FROM dbo.DateTable -- 4.3 sec
-- Les conversions qui suivent ne fonctionnent pas à cause de l'arrondi
-- A noter quand même que la dernière est plus rapide que le CAST as Date ???
SELECT @d =
DATEADD(d, 0,
CAST(X as
int))
FROM dbo.DateTable -- 6.2 sec
SELECT @d =
CAST(CAST(X as
int)
as
datetime)
FROM dbo.DateTable -- 4.1 sec
Je mets le résultat dans une variable, histoire de purement et simplement ne pas avoir à les afficher… ce qui donnerait un curseur client et ralentirait inutilement la requête. De plus j'exécute toujours 2 fois les commande, histoire de ne pas à prendre en compte le temps de compilation et vérifier que le temps est bien identique.
Dernier point le temps retenu est le temps consommé par le processeur, mesuré par SET STATISTICS TIME !
Les grands vainqueur si on en doutait encore sont les CAST(X AS DATE) et CAST(X AS TIME) nouveaux venus sous SQL Server 2008 ! Et ils sont tellement plus simples à utiliser !!!
Merci à la personne ayant mis en commentaires dans le précédent billet certaines de ces commandes, qui s'avèrent marcher pas mal J
Bons tests…
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :