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.