La meilleure façon de bande de l'époque partie d'un champ de date / heure est à l'aide de datediff et dateadd fonctions.
DateAdd(day, datediff(day,0, MydateValue), 0)
Cela prend un atout du fait que SQL Server stocke les dates que deux entiers, l'un représentant le nombre de jours depuis le premier jour "0" - (1 janv 1900), et le second, qui représente le nombre de tiques (chaque tick est environ 3,33 ms) depuis minuit (pour le moment) *.
la formule ci-dessus n'a tout simplement de ne lire que le premier entier. Il n'y a pas de conversion ou de transformation requis, de sorte qu'il est extrêmement rapide.
Pour rendre vos requêtes utiliser un index... utilisation de cette formule sur le filtrage des entrées de paramètres, ou sur "l'autre" côté du signe égal de l'tables date heure terrain, afin que l'optimiseur de requête n'a pas à exécuter le calcul sur chaque champ de la table pour déterminer les lignes qui satisfont le prédicat de filtre. Cela permet à votre recherche "argument de SARG-mesure" (ARGument de Recherche)
Where MyDateTimeColumn > DateAdd(day,
datediff(day,0, @MydateParameter), 0) -- SARG-able
plutôt que de
Where DateAdd(day, datediff(day,0,
MyDateTimeColumn ), 0) > MydateParameter -- Not SARG-able
-
REMARQUE. En interne, le deuxième entier (le temps) stocke les tiques. Dans une journée il y a 24 x 60 X 60 X 300 = 25,920,000 tiques (par hasard juste au-dessous de la valeur maximale d'un entier de 32 bits peut contenir). Cependant, vous ne devez pas vous inquiéter à ce sujet lors de l'arithmétique de la modification d'un datetime... Lors de l'ajout ou la soustraction des valeurs de datetimes vous pouvez traiter la valeur que d'une fraction comme si c'était exactement égale à la fraction de fraction de jour, comme si le datetime complet de la valeur est un nombre à virgule flottante composée d'une partie entière représentant la date et la partie fractionnaire représentant le temps). c'est à dire,
Declare @Dt DateTime Set @Dt = getdate()