Níže jsou uvedeny tři možnosti, jak pomocí T-SQL vrátit první den v měsíci na SQL Server.
Může to být první den aktuálního měsíce nebo první den měsíce podle daného data.
Možnost 1
Jeden způsob, jak to udělat, je tento:
DECLARE @date date;
SET @date = '2035-10-15';
SELECT DATEADD(dd, -( DAY( @date ) -1 ), @date);
Výsledek:
2035-10-01
To zahrnuje použití některých funkcí T-SQL k provádění posunu data, aby se datum vrátilo na začátek měsíce.
Další informace o DATEADD()
a DAY()
funkce, viz DATEADD()
Příklady v SQL Server a DAY()
Příklady v SQL Server.
Možnost 2
Zde je další možnost, jak získat první den v měsíci:
DECLARE @date date;
SET @date = '2035-10-15';
SELECT DATEADD(month, DATEDIFF(month, 0, @date), 0);
Výsledek:
2035-10-01 00:00:00.000
Zde jsme začlenili DATEDIFF()
funkce do našeho výpočtu.
Ačkoli jsme počáteční proměnnou deklarovali jako date
výsledkem je datetime
hodnota. Můžeme použít CONVERT()
nebo CAST()
převést výsledek na date
hodnota:
DECLARE @date date;
SET @date = '2035-10-15';
SELECT CAST(DATEADD(month, DATEDIFF(month, 0, @date), 0) AS date);
Výsledek:
2035-10-01
Možnost 3
Zde je další možnost:
DECLARE @date datetime;
SET @date = '2035-10-15';
SELECT @date - DAY( @date ) + 1;
Výsledek:
2035-10-01 00:00:00.000
Podobně jako u možnosti 2 je výsledkem datetime
hodnotu, ale tentokrát je to proto, že jsme proměnnou deklarovali jako datetime
hodnota. Můžeme však s ním zacházet stejně a převést jej na date
hodnota:
DECLARE @date datetime;
SET @date = '2035-10-15';
SELECT CAST(@date - DAY( @date ) + 1 AS date);
Výsledek:
2035-10-01
Důvod, proč jsme proměnnou nedeklarovali jako date
hodnota je, protože by to vedlo k chybě:
DECLARE @date date;
SET @date = '2035-10-15';
SELECT @date - DAY( @date ) + 1;
Výsledek:
Msg 206, Level 16, State 2, Line 3 Operand type clash: date is incompatible with int
Je to proto, že se snažíme přidat celé číslo k date
hodnotu, což nefunguje. Přidání celého čísla k datetime
value funguje, a proto jsme proměnnou deklarovali jako datetime
.