Когато работите с дати в 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 | +------------+------------+
Знакът плюс е аритметичен оператор за числови типове данни, но е оператор за конкатенация на низове за низове.