Transact-SQL включва куп функции, които ни помагат да работим с дати и часове. Една от най-често срещаните задачи при работа с дати е извличането на различните части от датата. Например, понякога искаме само годината или месеца. Друг път може да искаме деня от седмицата. Така или иначе, има много начини да направите това в SQL Server.
По-специално, следните функции ви позволяват да върнете деня, месеца и годината от дата в SQL Server.
DAY()
,MONTH()
иYEAR()
DATEPART()
DATENAME()
FORMAT()
Тези функции са обяснени по-долу.
Функциите DAY(), MONTH() и YEAR()
Най-очевидният начин да върнете деня, месеца и годината от дата е да използвате едноименните T-SQL функции. Да, T-SQL има функции, създадени специално с цел връщане на тези три части от дата.
Ето пример за това как работят:
DECLARE @date datetime2 ='2018-06-02 08:24:14.3112042';ИЗБЕРЕТЕ ДЕН(@date) КАТО ДЕН, МЕСЕЦ(@date) КАТО МЕСЕЦ, ГОДИНА(@date) КАТО ГОДИНА;
Резултат:
<пред>+-------+--------+-------+| ДЕН | МЕСЕЦ | ГОДИНА ||-------+--------+-------|| 2 | 6 | 2018 |+-------+-------+-------+
Тези функции връщат частта от датата като цяло число. Те връщат същия резултат като DATEPART()
функцията връща за посочената част от датата.
Функцията DATEPART()
DATEPART()
функцията е създадена специално за връщане на определени части от дата. Следователно можем да използваме тази функция, за да върнем точно същия резултат като предишния пример:
ДЕКЛАРИРАЙТЕ @date datetime2 ='2018-06-02 08:24:14.3112042';ИЗБЕРЕТЕ DATEPART(day, @date) КАТО ДЕН, DATEPART(weekday, @date) КАТО WEEKDAY, DATEPART(month, @date) AS MONTH, DATEPART(година, @дата) КАТО ГОДИНА;
Резултат:
<пред>+-------+-----------+--------+-------+| ДЕН | ДЕН ОТ ДЕЛНИЦА | МЕСЕЦ | ГОДИНА ||-------+-----------+--------+--------|| 2 | 7 | 6 | 2018 |+-------+-----------+--------+-------+
Едно от предимствата на използването на тази функция е, че можете да върнете и други части от датата и часа. Както можете да видите в този пример, върнах деня от седмицата, както и деня (day
е ден от месеца, weekday
е денят от седмицата). Можете също да върнете различните части от време, като минути, секунди, милисекунди и т.н. За повече примери вижте DATEPART()
Примери в SQL Server.
DATEPART()
функцията връща резултата си като цяло число и следователно няма да можете да получите името на месеца или деня от седмицата от датата. Но не се притеснявайте, можете да използвате DATENAME()
или FORMAT()
функции за това.
Функцията DATENAME()
DATENAME()
функцията е подобна на DATEPART()
функция, с изключение на това, че връща резултата като символен низ вместо цяло число. DATENAME()
също така връща месец и делничен ден като пълното им име, а не като числената им стойност.
Пример:
DECLARE @date datetime2 ='2018-06-02 08:24:14.3112042';ИЗБЕРЕТЕ DATENAME(day, @date) КАТО ДЕН, DATENAME(weekday, @date) КАТО WEEKDAY, DATENAME(month, @date) AS MONTH, DATENAME(година, @дата) КАТО ГОДИНА;
Резултат:
<пред>+-------+-----------+--------+-------+| ДЕН | ДЕН ОТ ДЕЛНИЦА | МЕСЕЦ | ГОДИНА ||-------+-----------+--------+--------|| 2 | събота | юни | 2018 |+-------+-----------+--------+-------+
За повече примери за тази функция вижте DATENAME()
Примери в SQL Server.
Функцията FORMAT()
Можем да използваме FORMAT()
функция, за да върне същите стойности като при DATENAME()
функция и др.
Това е по-универсална функция от предишните. Позволява ви да форматирате дата/час, както и числови стойности като низове. Връщаната стойност е или nvarchar или null (в зависимост от входа), а дължината на низа се определя от посочения формат.
FORMAT()
също така предоставя повече опции за това как се представя частта от датата. Можете да посочите дали да се показва като един знак, два знака, три, четири и дори пет в някои случаи.
Ето примери за демонстрация.
Ден
DECLARE @date datetime2 ='2018-06-02 08:24:14.3112042';ИЗБЕРЕТЕ ФОРМАТ(@date, 'd') КАТО d, FORMAT(@date, 'dd') КАТО dd, FORMAT(@date , 'ddd') КАТО ddd, FORMAT(@date, 'dddd') КАТО dddd;
Резултат:
+-----+------+-------+----------+| г | дд | ддд | dddd ||-----+------+-------+----------|| 2 | 02 | сб | Събота |+-----+------+-------+----------+
Месец
DECLARE @date datetime2 ='2018-06-02 08:24:14.3112042';ИЗБЕРЕТЕ ФОРМАТ(@date, 'M') КАТО M, FORMAT(@date, 'MM') КАТО MM, FORMAT(@date , 'MMM') КАТО MMM, FORMAT(@date, 'MMMMM') КАТО MMMM;
Резултат:
+-----+-----+-------+-------+| М | ММ | МММ | ММММ ||-----+-----+-------+--------|| 6 | 06 | юни | Юни |+-----+-----+-------+-------+
Година
DECLARE @date datetime2 ='2018-06-02 08:24:14.3112042';ИЗБЕРЕТЕ ФОРМАТ(@date, 'y') КАТО y, FORMAT(@date, 'yy') КАТО yy, FORMAT(@date , 'yyy') КАТО yyy, FORMAT(@date, 'yyyy') КАТО yyyy, FORMAT(@date, 'yyyyy') КАТО yyyyy;
Резултат:
+-----+------+-------+-------+-------+| y | yy | yyy | yyyy | yyyyy ||-----+------+-------+-------+--------|| 18 | 18 | 2018 г. | 2018 г. | 02018 |+-----+------+-------+-------+--------+
Забележете, че имаме опцията да форматираме частта от годината като пет цифри.
Относно броя на цифрите
Когато връща дата в цифров вид, спецификаторът на формата определя минималния брой цифри за връщане. Например, когато използвате yyy
, годината ще бъде върната като три цифри, ако годината е 0008
но като четири цифри, ако годината е 2008
.
Пример:
DECLARE @date datetime2 ='0008-06-02 08:24:14.3112042';ИЗБЕРЕТЕ ФОРМАТ(@date, 'y') КАТО y, FORMAT(@date, 'yy') КАТО yy, FORMAT(@date , 'yyy') КАТО yyy, FORMAT(@date, 'yyyy') КАТО yyyy, FORMAT(@date, 'yyyyy') КАТО yyyyy;
Резултат:
+-----+------+-------+-------+-------+| y | yy | yyy | yyyy | yyyyy ||-----+------+-------+-------+--------|| 8 | 08 | 008 | 0008 | 00008 |+-----+------+-------+-------+--------+
Също така, когато използвате единична опция (напр. d
) като спецификатор на дата, ще трябва да добавите интервал, ако искате само тази част от датата да бъде върната сама. Ако не направите това, ще получите повече от тази част от датата.
Пример:
DECLARE @date datetime2 ='2008-06-02 08:24:14.3112042';ИЗБЕРЕТЕ ФОРМАТ(@date, 'd') КАТО 'Space', FORMAT(@date, 'd') КАТО 'Без интервал' , FORMAT(@date, 'M ') КАТО 'Space', FORMAT(@date, 'M') КАТО 'Без интервал', FORMAT(@date, 'y ') КАТО 'Space', FORMAT(@date, ' y') AS 'No Space';
Резултат:
+--------+------------+--------+-----------+ ---------+------------+| Космос | Няма място | Космос | Няма място | Космос | Няма място ||---------+------------+---------+-----------+ ---------+-----------|| 2 | 02.06.2008 г. | 6 | 2 юни | 8 | юни 2008 г. |+---------+------------+--------+-----------+ ---------+-----------+
За повече FORMAT()
примери, вижте Как да форматирате датата и часа в SQL Server.