По-долу са три опции за използване на T-SQL за връщане на първия ден от месеца в SQL Server.
Това може да бъде първият ден от текущия месец или първият ден от месеца въз основа на дадена дата.
Опция 1
Един от начините да го направите е така:
DECLARE @date date;
SET @date = '2035-10-15';
SELECT DATEADD(dd, -( DAY( @date ) -1 ), @date);
Резултат:
2035-10-01
Това включва използването на някои T-SQL функции за извършване на изместване на датата, за да се върне датата обратно в началото на месеца.
За повече информация относно DATEADD()
и DAY()
функции, вижте DATEADD()
Примери в SQL Server и DAY()
Примери в SQL Server.
Опция 2
Ето още една опция за получаване на първия ден от месеца:
DECLARE @date date;
SET @date = '2035-10-15';
SELECT DATEADD(month, DATEDIFF(month, 0, @date), 0);
Резултат:
2035-10-01 00:00:00.000
Тук включихме DATEDIFF()
функция в нашето изчисление.
Въпреки че декларирахме първоначалната променлива като date
стойност, резултатът е datetime
стойност. Можем да използваме CONVERT()
или CAST()
за да конвертирате резултата в date
стойност:
DECLARE @date date;
SET @date = '2035-10-15';
SELECT CAST(DATEADD(month, DATEDIFF(month, 0, @date), 0) AS date);
Резултат:
2035-10-01
Опция 3
Ето още една опция:
DECLARE @date datetime;
SET @date = '2035-10-15';
SELECT @date - DAY( @date ) + 1;
Резултат:
2035-10-01 00:00:00.000
Подобно на опция 2, резултатът е datetime
стойност, но този път е така, защото сме декларирали променливата като datetime
стойност. Въпреки това можем да му приложим същото третиране, за да го преобразуваме в date
стойност:
DECLARE @date datetime;
SET @date = '2035-10-15';
SELECT CAST(@date - DAY( @date ) + 1 AS date);
Резултат:
2035-10-01
Причината, поради която не сме декларирали променливата като date
стойност е, защото това би довело до грешка:
DECLARE @date date;
SET @date = '2035-10-15';
SELECT @date - DAY( @date ) + 1;
Резултат:
Msg 206, Level 16, State 2, Line 3 Operand type clash: date is incompatible with int
Това е така, защото се опитваме да добавим цяло число към date
стойност, която не работи. Въпреки това добавянето на цяло число към datetime
value работи и затова декларирахме променливата като datetime
.