Poniżej znajdują się trzy opcje używania T-SQL do zwracania pierwszego dnia miesiąca w SQL Server.
Może to być pierwszy dzień bieżącego miesiąca lub pierwszy dzień miesiąca na podstawie podanej daty.
Opcja 1
Jednym ze sposobów na to jest:
DECLARE @date date;
SET @date = '2035-10-15';
SELECT DATEADD(dd, -( DAY( @date ) -1 ), @date);
Wynik:
2035-10-01
Wiąże się to z użyciem niektórych funkcji T-SQL w celu przesunięcia daty w celu przywrócenia daty na początek miesiąca.
Aby uzyskać więcej informacji o DATEADD()
i DAY()
funkcje, zobacz DATEADD()
Przykłady w SQL Server i DAY()
Przykłady w SQL Server.
Opcja 2
Oto kolejna opcja uzyskania pierwszego dnia miesiąca:
DECLARE @date date;
SET @date = '2035-10-15';
SELECT DATEADD(month, DATEDIFF(month, 0, @date), 0);
Wynik:
2035-10-01 00:00:00.000
Tutaj włączyliśmy DATEDIFF()
funkcji w naszych obliczeniach.
Chociaż zadeklarowaliśmy zmienną początkową jako date
wartość, wynikiem jest datetime
wartość. Możemy użyć CONVERT()
lub CAST()
przekonwertować wynik na date
wartość:
DECLARE @date date;
SET @date = '2035-10-15';
SELECT CAST(DATEADD(month, DATEDIFF(month, 0, @date), 0) AS date);
Wynik:
2035-10-01
Opcja 3
Oto kolejna opcja:
DECLARE @date datetime;
SET @date = '2035-10-15';
SELECT @date - DAY( @date ) + 1;
Wynik:
2035-10-01 00:00:00.000
Podobnie jak w przypadku opcji 2, wynikiem jest datetime
wartość, ale tym razem dzieje się tak, ponieważ zadeklarowaliśmy zmienną jako datetime
wartość. Możemy jednak potraktować go w ten sam sposób, aby przekonwertować go na date
wartość:
DECLARE @date datetime;
SET @date = '2035-10-15';
SELECT CAST(@date - DAY( @date ) + 1 AS date);
Wynik:
2035-10-01
Powód, dla którego nie zadeklarowaliśmy zmiennej jako date
wartość jest spowodowana błędem:
DECLARE @date date;
SET @date = '2035-10-15';
SELECT @date - DAY( @date ) + 1;
Wynik:
Msg 206, Level 16, State 2, Line 3 Operand type clash: date is incompatible with int
Dzieje się tak, ponieważ próbujemy dodać liczbę całkowitą do date
wartość, która nie działa. Jednak dodanie liczby całkowitej do datetime
value działa, dlatego zadeklarowaliśmy zmienną jako datetime
.