Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL Server DATEPART() vs DATENAME() — jaka jest różnica?

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()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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Utwórz datę z dnia, miesiąca i roku za pomocą T-SQL

  2. 6 sposobów konwersji ciągu na wartość daty/godziny w SQL Server

  3. Zmień typ kolumny z liczbami z varchar na int

  4. Jak porównywać daty w SQL Server

  5. Jak skopiować rekord w tabeli SQL, ale zamienić unikalny identyfikator nowego wiersza?