Comment supprimer la partie heure d'une valeur datetime (SQL Server) ?

Voici ce que j'utilise :

SELECT CAST(FLOOR(CAST(getdate() as FLOAT)) as DATETIME)

Je pense qu'il existe peut-être une méthode meilleure et plus élégante.

Exigences :

  • Cela doit être aussi rapide que possible (moins il y a de casting, mieux c'est).
  • Le résultat final doit être un type datetime, pas une chaîne.
请先 登录 后评论

2 réponses

Michael Stum

Votre CAST-FLOOR-CAST semble déjà être le moyen optimal, du moins sur MS SQL Server 2005.

Certaines autres solutions que j'ai vues ont une conversion de chaîne, comme Select Convert(varchar(11), getdate(),101), qui est plus lente d'un facteur 10.

请先 登录 后评论
ErikE

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

请先 登录 后评论