SQL Server 2008 et versions ultérieures
Dans SQL Server 2008 et versions ultérieures, bien sûr, le moyen le plus rapide est Convert(date, @date)
. Cela peut être reconverti en datetime
ou datetime2
si nécessaire.
Qu'est-ce qui est vraiment meilleur dans SQL Server 2005 et versions antérieures ?
J'ai vu des affirmations incohérentes sur ce qui est le plus rapide pour tronquer l'heure d'une date dans SQL Server, et certaines personnes ont même dit qu'elles avaient fait des tests, mais mon expérience a été différente. Faisons donc des tests plus rigoureux et laissons tout le monde avoir le script afin que si je fais des erreurs, les gens puissent me corriger.
Les conversions flottantes ne sont pas exactes
Tout d'abord, je m'abstiendrais de convertir datetime
en float
, car il ne se convertit pas correctement. Vous pouvez vous en tirer avec précision, mais je pense que c'est une mauvaise idée de l'utiliser car cela indique implicitement aux développeurs qu'il s'agit d'une opération sûre et ce n'est pas le cas. Jetez un oeil :
declare @d datetime;
set @d = '2010-09-12 00:00:00.003';
select Convert(datetime, Convert(float, @d));
-- result: 2010-09-12 00:00:00.000 -- oops
Ce n'est pas quelque chose que nous devrions enseigner aux gens dans notre code ou dans nos exemples en ligne.
De plus, ce n'est même pas le moyen le plus rapide !
Preuve – Tests de performance
Si vous souhaitez effectuer vous-même des tests pour voir comment les différentes méthodes s'empilent réellement, vous aurez besoin de ce script de configuration pour exécuter les tests plus loin :
create table AllDay (Tm datetime NOT NULL CONSTRAINT PK_AllDay PRIMARY KEY CLUSTERED);
declare @d datetime;
set @d = DateDiff(Day, 0, GetDate());
insert AllDay select @d;
while @@ROWCOUNT != 0
insert AllDay
select * from (
select Tm =
DateAdd(ms, (select Max(DateDiff(ms, @d, Tm)) from AllDay) + 3, Tm)
from AllDay
) X
where Tm < DateAdd(Day, 1, @d);
exec sp_spaceused AllDay; -- 25,920,000 rows
Veuillez noter que cela crée un 427.57