Когато работите с дати в SQL Server, понякога може да откриете, че посягате към DATEPART()
функция, само за да разберете, че това, от което наистина се нуждаете, е DATENAME()
функция. Тогава може да има други ситуации, когато DATEPART()
всъщност е за предпочитане пред DATENAME()
.
И така, каква е разликата между DATEPART()
и DATENAME()
функции?
Нека разберем.
Дефиниции
Разликата между тези две функции е в техните дефиниции:
DATEPART()
- Връща цяло число който представлява посочената част от дата на посочената дата .
DATENAME()
- Връща низ от символи който представлява посочената част от дата на посочената дата
Според техните дефиниции, единствената разлика между тези две функции е типът връщане:
DATEPART()
връща цяло число.DATENAME()
връща низ.
Така че това е разликата.
И в двете дефиниции datepart е частта от датата, която искате (напр. месец), и дата е датата, от която искате да се върне датата.
Имена на месеци и дни
Най-очевидният пример, където DATENAME()
е по-подходящ за DATEPART()
е когато искате името на деня или месеца да бъде върнато.
Ето един пример.
DATENAME()
Ето какво е DATENAME()
връща, когато искаме деня от седмицата и месеца от дата:
SELECT DATENAME(weekday, '2000-01-01') AS 'DATENAME Weekday', DATENAME(month, '2000-01-01') AS 'DATENAME Month';
Резултат:
+--------------------+------------------+ | DATENAME Weekday | DATENAME Month | |--------------------+------------------| | Saturday | January | +--------------------+------------------+
DATEPART()
Ето какво е DATEPART()
връща:
SELECT DATEPART(weekday, '2000-01-01') AS 'DATEPART Weekday', DATEPART(month, '2000-01-01') AS 'DATEPART Month';
Резултат:
+--------------------+------------------+ | DATEPART Weekday | DATEPART Month | |--------------------+------------------| | 7 | 1 | +--------------------+------------------+
Когато резултатите са еднакви
В повечето случаи резултатите от двете функции ще изглеждат еднакви. Това е така, защото повечето части от датата са числови по своето естество. Например:
SELECT DATEPART(year, '2000-01-01') AS DATEPART, DATENAME(year, '2000-01-01') AS DATENAME;
Резултат:
+------------+------------+ | DATEPART | DATENAME | |------------+------------| | 2000 | 2000 | +------------+------------+
Въпреки това, както споменахме, едното връща цяло число, а другото връща низ.
Можем да видим доказателство за това със следния пример:
SELECT DATEPART(year, '2000-01-01') + '1' AS DATEPART, DATENAME(year, '2000-01-01') + '1' AS DATENAME;
Резултат:
+------------+------------+ | DATEPART | DATENAME | |------------+------------| | 2001 | 20001 | +------------+------------+
Знакът плюс е аритметичен оператор за числови типове данни, но е оператор за конкатенация на низове за низове.