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.
cast(getdate() as date)
?getdate()
tutaj jest stand-in dla dowolnego źródła datetime.Tylko dla SQL Server 2008
Jeśli chcesz, prześlij go z powrotem do daty i godziny
źródło
Aby uzyskać bardziej kompletną odpowiedź, oto działający sposób obcięcia dowolnej części daty w dół i uwzględnienia minut (zastąp
GETDATE()
ją datą obcięcia ).Różni się to od przyjętej odpowiedzi, ponieważ można użyć nie tylko
dd
(dni), ale dowolnej części daty (patrz tutaj ):Zauważ, że w powyższym wyrażeniu
0
jest to stała data na początku roku (1900-01-01). Jeśli chcesz obciąć mniejsze części, takie jak sekundy lub milisekundy, musisz przyjąć stałą datę, która jest bliższa dacie, która ma zostać obcięta, aby uniknąć przepełnienia.źródło
dateadd(minute, datediff(minute, 0, GETDATE()) / 15 * 15, 0)
Fragment, który znalazłem w Internecie, gdy musiałem to zrobić, to:
źródło
DateAdd(dd, DateDiff(...), 0)
. To może cię ugryźć, jeśli nie będziesz ostrożny.W SQl 2005 twoja funkcja trunc_date może być zapisana w ten sposób.
(1)
Pierwsza metoda jest znacznie czystsza. Używa tylko 3 wywołań metod, w tym końcowej metody CAST () i nie wykonuje konkatenacji ciągów, co jest automatycznym plusem. Co więcej, nie ma tutaj rzutów typu ogromnego. Jeśli możesz sobie wyobrazić, że znaczniki daty / godziny mogą być reprezentowane, to konwersja dat na liczby i powrót do dat jest dość łatwym procesem.
(2)
Jeśli obawiasz się wdrożenia Microsoft DataTime (2) lub (3) może być w porządku.
(3)
Po trzecie, bardziej szczegółowa metoda. Wymaga to podzielenia daty na części roku, miesiąca i dnia, zestawienia ich w formacie „rrrr / mm / dd”, a następnie przeniesienia z powrotem na datę. Ta metoda obejmuje 7 wywołań metody, w tym końcową metodę CAST (), nie wspominając już o konkatenacji ciągów.
źródło
źródło
wybierz obsadę (floor (cast (getdate () as float)) as datetime) Odnoś to: http://microsoftmiles.blogspot.com/2006/11/remove-time-from-datetime-in-sql-server.html
źródło
Dla tych z was, którzy przybyli tutaj, szukając sposobu na obcięcie pola DATETIME do mniej niż całego dnia, na przykład co minutę, możesz użyć tego:
więc gdyby dzisiaj był,
2010-11-26 14:54:43.123
to by to wróciło2010-11-26 14:54:00.000
.Aby zmienić interwał, do którego dąży, zamień 1440.0 na liczbę interwałów w ciągu dnia, na przykład:
(Zawsze umieszczaj
.0
na końcu, aby niejawnie rzutować na zmiennoprzecinkowe)Dla tych, którzy zastanawiają się, do czego
(3.0/86400000)
służy moje obliczenie, SQL Server 2005 nie wydajeFLOAT
sięDATETIME
dokładnie rzutować , więc dodaje to 3 milisekundy przed umieszczeniem go na podłodze.źródło
datetime2
typem danych.To zapytanie powinno dać wynik równoważny do
trunc(sysdate)
w Oracle.Mam nadzieję że to pomoże!
źródło
Możesz także wyodrębnić datę
using Substring
ze zmiennej datetime, a rzutowanie z powrotem do datetime zignoruje część czasu.Możesz także uzyskać dostęp do części zmiennej datetime i scalić je do skróconej daty konstrukcji, mniej więcej tak:
źródło
Wyrocznia:
SQL Server:
Może być podobnie stosowany do obcinania minut lub godzin od daty.
źródło
możesz po prostu to zrobić (SQL 2008):
28.05.2009
źródło
TRUNC (aDate, 'DD') obetnie wartość min, sec i hrs
SRC: http://www.techonthenet.com/oracle/functions/trunc_date.php
źródło