Podczas pracy z datami w SQL Server czasami możesz sięgnąć po DATEPART()
funkcji, tylko po to, by zdać sobie sprawę, że to, czego naprawdę potrzebujesz, to DATENAME()
funkcjonować. Mogą wystąpić inne sytuacje, w których DATEPART()
jest właściwie lepsze niż DATENAME()
.
Jaka jest więc różnica między DATEPART()
i DATENAME()
funkcje?
Dowiedzmy się.
Definicje
Różnica między tymi dwiema funkcjami tkwi w ich definicjach:
DATEPART()
- Zwraca liczbę całkowitą reprezentujący określoną datapart określonej daty .
DATENAME()
- Zwraca ciąg znaków reprezentujący określoną datapart określonej daty
Zgodnie z ich definicjami jedyną różnicą między tymi dwiema funkcjami jest typ zwracany:
DATEPART()
zwraca liczbę całkowitą.DATENAME()
zwraca ciąg.
Na tym polega różnica.
W obu definicjach datapart to część żądanej daty (np. miesiąc), a data to data, z której ma zostać zwrócona data.
Nazwy miesięcy i dni
Najbardziej oczywisty przykład, w którym DATENAME()
jest bardziej odpowiedni dla DATEPART()
wtedy chcesz, aby nazwa dnia lub miesiąca została zwrócona.
Oto przykład.
DATANAZWA()
Oto, co DATENAME()
zwraca, gdy chcemy, aby dzień tygodnia i miesiąc od daty:
SELECT DATENAME(weekday, '2000-01-01') AS 'DATENAME Weekday', DATENAME(month, '2000-01-01') AS 'DATENAME Month';
Wynik:
+--------------------+------------------+ | DATENAME Weekday | DATENAME Month | |--------------------+------------------| | Saturday | January | +--------------------+------------------+
DATAPART()
Oto, co DATEPART()
zwraca:
SELECT DATEPART(weekday, '2000-01-01') AS 'DATEPART Weekday', DATEPART(month, '2000-01-01') AS 'DATEPART Month';
Wynik:
+--------------------+------------------+ | DATEPART Weekday | DATEPART Month | |--------------------+------------------| | 7 | 1 | +--------------------+------------------+
Gdy wyniki są takie same
W większości przypadków wyniki obu funkcji będą wyglądały na takie same. Dzieje się tak, ponieważ większość dat jest z natury numeryczna. Na przykład:
SELECT DATEPART(year, '2000-01-01') AS DATEPART, DATENAME(year, '2000-01-01') AS DATENAME;
Wynik:
+------------+------------+ | DATEPART | DATENAME | |------------+------------| | 2000 | 2000 | +------------+------------+
Jednak, jak wspomniano, jedna zwraca liczbę całkowitą, a druga zwraca łańcuch.
Dowodem na to jest następujący przykład:
SELECT DATEPART(year, '2000-01-01') + '1' AS DATEPART, DATENAME(year, '2000-01-01') + '1' AS DATENAME;
Wynik:
+------------+------------+ | DATEPART | DATENAME | |------------+------------| | 2001 | 20001 | +------------+------------+
Znak plus jest operatorem arytmetycznym w numerycznych typach danych, ale jest to operator konkatenacji łańcuchów w łańcuchach.