Najbardziej rozsądnym sposobem, aby to zrobić, jest usunięcie części czasu z wartości daty i czasu i porównanie wyników, a najlepszym sposobem na usunięcie części czasu z wartości daty i czasu jest:
cast(current_timestamp as date)
Kiedyś używałem i zalecałem proces, który wyglądał jak jedna z następujących dwóch linii:
cast(floor(cast(getdate() as float)) as datetime)
dateadd(dd,0, datediff(dd,0, getDate()))
Ale teraz, gdy SQL Server ma Date
typ, który nie zawiera składnika czasu, nie ma powodu, aby używać którejkolwiek z tych technik.
Jeszcze jedną rzeczą, o której należy pamiętać, jest to, że nadal spowoduje to zablokowanie zapytania, jeśli musisz to zrobić dla dwóch wartości daty i godziny dla każdego wiersza w klauzuli WHERE lub warunku sprzężenia. Jeśli to możliwe, chcesz to jakoś rozłożyć na czynniki, aby było to wstępnie obliczone w jak największym stopniu, na przykład za pomocą widoku lub kolumny obliczeniowej.
Na koniec zwróć uwagę, że funkcja DATEDIFF porównuje liczbę przekroczonych granic. Oznacza to datediff w dniach między '2009-09-14 11:59:59'
i '2009-09-15 00:00:01'
wynosi 1, mimo że upłynęły tylko 2 sekundy, ale DATEDIFF w dniach między '2009-09-15 00:00:01'
i '2009-09-15 11:59:59'
nadal wynosi zero, mimo że upłynęło 86 398 sekund. Tak naprawdę nie obchodzi go tam część czasu, tylko granice. W zależności od tego, co próbuje zrobić Twoje zapytanie, możesz to wykorzystać na swoją korzyść.