Nedan finns tre alternativ för att använda T-SQL för att returnera den första dagen i månaden i SQL Server.
Detta kan vara den första dagen i den aktuella månaden eller den första dagen i en månad baserat på ett givet datum.
Alternativ 1
Ett sätt att göra det är så här:
DECLARE @date date;
SET @date = '2035-10-15';
SELECT DATEADD(dd, -( DAY( @date ) -1 ), @date);
Resultat:
2035-10-01
Detta innebär att man använder vissa T-SQL-funktioner för att utföra datumskifte för att få datumet tillbaka till början av månaden.
För mer information om DATEADD()
och DAY()
funktioner, se DATEADD()
Exempel i SQL Server och DAY()
Exempel i SQL Server.
Alternativ 2
Här är ett annat alternativ för att få den första dagen i månaden:
DECLARE @date date;
SET @date = '2035-10-15';
SELECT DATEADD(month, DATEDIFF(month, 0, @date), 0);
Resultat:
2035-10-01 00:00:00.000
Här har vi införlivat DATEDIFF()
funktion i vår beräkning.
Även om vi deklarerade den initiala variabeln som ett date
värde, är resultatet en datetime
värde. Vi kan använda CONVERT()
eller CAST()
för att konvertera resultatet till ett date
värde:
DECLARE @date date;
SET @date = '2035-10-15';
SELECT CAST(DATEADD(month, DATEDIFF(month, 0, @date), 0) AS date);
Resultat:
2035-10-01
Alternativ 3
Här är ett annat alternativ:
DECLARE @date datetime;
SET @date = '2035-10-15';
SELECT @date - DAY( @date ) + 1;
Resultat:
2035-10-01 00:00:00.000
I likhet med alternativ 2 är resultatet en datetime
värde, men den här gången beror det på att vi deklarerade variabeln som en datetime
värde. Men vi kan ge det samma behandling för att konvertera det till ett date
värde:
DECLARE @date datetime;
SET @date = '2035-10-15';
SELECT CAST(@date - DAY( @date ) + 1 AS date);
Resultat:
2035-10-01
Anledningen till att vi inte deklarerade variabeln som ett date
värdet beror på att det skulle resultera i ett fel:
DECLARE @date date;
SET @date = '2035-10-15';
SELECT @date - DAY( @date ) + 1;
Resultat:
Msg 206, Level 16, State 2, Line 3 Operand type clash: date is incompatible with int
Detta beror på att vi försöker lägga till ett heltal till ett date
värde, vilket inte fungerar. Men att lägga till ett heltal till en datetime
värde fungerar, och det är därför vi deklarerade variabeln som datetime
.