To nadal często zbiera dodatkowe głosy, nawet kilka lat później, dlatego muszę je zaktualizować do nowoczesnych wersji Sql Server. W przypadku Sql Server 2008 i nowszych jest to proste:
cast(getDate() As Date)
Pamiętaj, że trzy ostatnie akapity w dolnej części nadal obowiązują i często musisz cofnąć się o krok i znaleźć sposób na uniknięcie obsady.
Ale są też inne sposoby na osiągnięcie tego. Oto najczęstsze.
Prawidłowy sposób (nowość od Sql Server 2008):
cast(getdate() As Date)
Prawidłowy sposób (stary):
dateadd(dd, datediff(dd,0, getDate()), 0)
Jest to teraz starsze, ale nadal warto o tym wiedzieć, ponieważ można je łatwo dostosować do innych punktów czasowych, takich jak pierwsza chwila miesiąca, minuty, godziny lub roku.
Ten prawidłowy sposób wykorzystuje udokumentowane funkcje, które są częścią standardu ansi i mają gwarancję działania, ale może być nieco wolniejsze. Działa poprzez sprawdzenie, ile dni jest od dnia 0 do dnia bieżącego, i dodanie tych dni z powrotem do dnia 0. Będzie działać bez względu na to, jak przechowywana jest data i data, bez względu na ustawienia regionalne.
Szybki sposób:
cast(floor(cast(getdate() as float)) as datetime)
Działa to, ponieważ kolumny datetime są przechowywane jako 8-bajtowe wartości binarne. Rzuć je, aby unosić się, wyrównaj podłogę, aby usunąć ułamek, a część wartości czasu zniknie, gdy rzucisz je z powrotem na datę i godzinę. Wszystko przesuwa się trochę bez skomplikowanej logiki i jest bardzo szybkie.
Pamiętaj, że zależy to od szczegółów implementacyjnych, które Microsoft może zmienić w dowolnym momencie, nawet w przypadku automatycznej aktualizacji usług. Nie jest też zbyt przenośny. W praktyce jest mało prawdopodobne, aby ta implementacja uległa zmianie w najbliższym czasie, ale nadal ważne jest, aby zdawać sobie sprawę z niebezpieczeństwa, jeśli zdecydujesz się z niej skorzystać. A teraz, gdy mamy opcję przesyłania jako daty, rzadko jest to konieczne.
Zły kierunek:
cast(convert(char(11), getdate(), 113) as datetime)
Niepoprawny sposób działa przez konwersję na ciąg, obcinanie ciągu i konwertowanie z powrotem do daty i godziny. Jest źle , z dwóch powodów: 1) może nie działać we wszystkich lokalizacjach i 2) jest to najwolniejszy możliwy sposób, aby to zrobić ... i nie tylko trochę; jest to rząd wielkości lub dwa wolniejsze niż inne opcje.
Aktualizacja Ostatnio zdobywałem trochę głosów, dlatego chcę dodać do tego, że odkąd to opublikowałem, widziałem dość solidne dowody na to, że Sql Server zoptymalizuje różnicę wydajności między sposobem „poprawnym” a sposobem „szybkim” , co oznacza, że powinieneś teraz faworyzować to pierwsze.
W obu przypadkach chcesz napisać swoje zapytania, aby uniknąć konieczności robienia tego w pierwszej kolejności . Bardzo rzadko powinieneś wykonywać tę pracę w bazie danych.
W większości miejsc baza danych jest już twoim wąskim gardłem. Zasadniczo jest to serwer, który jest najdroższym do dodania sprzętu w celu poprawy wydajności i najtrudniejszy do prawidłowego dodania tych dodatków (na przykład musisz zrównoważyć dyski z pamięcią). Najtrudniej jest też skalować na zewnątrz, zarówno pod względem technicznym, jak i biznesowym; z technicznego punktu widzenia znacznie łatwiej jest dodać serwer WWW lub serwer aplikacji niż serwer bazy danych, a nawet jeśli to nieprawda, nie płacisz ponad 20 000 USD za licencję na serwer dla IIS lub apache.
Chodzi mi o to, aby w miarę możliwości wykonywać tę pracę na poziomie aplikacji. Tylko raz powinny kiedykolwiek znajdziesz się obcinanie datetime SQL Server jest, gdy trzeba grupie przez cały dzień, a nawet wtedy powinieneś mieć dodatkową kolumnę utworzone jako kolumna obliczana, utrzymany w momencie wstawiania / aktualizacji lub utrzymywane w logice aplikacji. Pobierz tę przełamującą indeks, obciążającą procesor bazę danych.