Najlepszym sposobem na usunięcie części czasu z pola daty i czasu jest użycie funkcji datediff i dateadd.
DateAdd(day, datediff(day,0, MydateValue), 0)
Wykorzystuje to fakt, że SQL Server przechowuje daty jako dwie liczby całkowite, jedna reprezentująca liczbę dni od dnia „0” - (1 stycznia 1900), a druga reprezentująca liczbę zaznaczeń (każdy tik trwa około 3,33 ms) od północy (na czas)*.
powyższa formuła musi po prostu odczytać tylko pierwszą liczbę całkowitą. Nie wymaga konwersji ani przetwarzania, dzięki czemu jest niezwykle szybki.
Aby zapytania korzystały z indeksu... użyj tej formuły najpierw na wejściowych parametrach filtrowania lub po "drugiej" stronie znaku równości z pola data i godzina tabeli, aby optymalizator zapytań nie musiał uruchamiać obliczeń w każdym polu datetime w tabeli, aby określić, które wiersze spełniają predykat filtru. To sprawia, że argument wyszukiwania jest „zgodny z SARG” (Argument wyszukiwania)
Where MyDateTimeColumn > DateAdd(day,
datediff(day,0, @MydateParameter), 0) -- SARG-able
zamiast
Where DateAdd(day, datediff(day,0,
MyDateTimeColumn ), 0) > @MydateParameter -- Not SARG-able
* NOTATKA. Wewnętrznie druga liczba całkowita (część czasu) przechowuje kleszcze. W ciągu dnia jest 24 x 60 x 60 x 300 =25 920 000 tików (nieoczekiwanie tuż poniżej maksymalnej wartości, jaką może pomieścić 32-bitowa liczba całkowita). Jednak nie musisz się tym martwić podczas arytmetycznej modyfikacji daty i godziny... Podczas dodawania lub odejmowania wartości od daty i godziny możesz traktować wartość jako ułamek tak, jakby była dokładnie równa części ułamkowej dnia, tak jakby pełna wartość datetime była liczbą zmiennoprzecinkową składającą się z części całkowitej reprezentującej datę i części ułamkowej reprezentującej godzinę). czyli
`Declare @Dt DateTime Set @Dt = getdate()
Set @Dt = @Dt + 1.0/24 -- Adds one hour
Select @Dt
Set @Dt = @Dt - .25 -- Moves back 6 hours
Select @Dt`