Transact-SQL innehåller ett gäng funktioner som hjälper oss att arbeta med datum och tider. En av de vanligaste uppgifterna när man arbetar med datum är att extrahera dejtens olika delar. Till exempel, ibland vill vi bara ha året, eller månaden. Andra gånger kanske vi vill ha veckodag. Hur som helst, det finns många sätt att göra detta i SQL Server.
I synnerhet låter följande funktioner dig returnera dag, månad och år från ett datum i SQL Server.
DAY()
,MONTH()
ochYEAR()
DATEPART()
DATENAME()
FORMAT()
Dessa funktioner förklaras nedan.
Funktionerna DAY(), MONTH() och YEAR()
Det mest uppenbara sättet att returnera dag, månad och år från ett datum är att använda T-SQL-funktionerna med samma namn. Ja, T-SQL har funktioner byggda specifikt för att returnera dessa tre datumdelar.
Här är ett exempel på hur de fungerar:
DECLARE @date datetime2 = '2018-06-02 08:24:14.3112042'; SELECT DAY(@date) AS DAY, MONTH(@date) AS MONTH, YEAR(@date) AS YEAR;
Resultat:
+-------+---------+--------+ | DAY | MONTH | YEAR | |-------+---------+--------| | 2 | 6 | 2018 | +-------+---------+--------+
Dessa funktioner returnerar datumdelen som ett heltal. De returnerar samma resultat som DATEPART()
funktion returnerar för den angivna datumdelen.
DATUMPART()-funktionen
DATEPART()
funktion byggdes specifikt för att returnera specificerade delar av ett datum. Därför kan vi använda den här funktionen för att returnera exakt samma resultat som föregående exempel:
DECLARE @date datetime2 = '2018-06-02 08:24:14.3112042'; SELECT DATEPART(day, @date) AS DAY, DATEPART(weekday, @date) AS WEEKDAY, DATEPART(month, @date) AS MONTH, DATEPART(year, @date) AS YEAR;
Resultat:
+-------+-----------+---------+--------+ | DAY | WEEKDAY | MONTH | YEAR | |-------+-----------+---------+--------| | 2 | 7 | 6 | 2018 | +-------+-----------+---------+--------+
En fördel med att använda den här funktionen är att du även kan returnera andra delar av datum och tid. Som du kan se med det här exemplet returnerade jag såväl veckodagen som dagen (day
är dagen i månaden, weekday
är veckodagen). Du kan också returnera de olika tidsdelarna, såsom minuter, sekunder, millisekunder, etc. För fler exempel, se DATEPART()
Exempel i SQL Server.
DATEPART()
funktion returnerar sitt resultat som ett heltal, och därför kommer du inte att kunna få månadsnamnet eller veckodagsnamnet från datumet. Men oroa dig inte, du kan använda DATENAME()
eller FORMAT()
funktioner för det.
DATUMNAMN()-funktionen
DATENAME()
funktionen liknar DATEPART()
funktion, förutom att den returnerar resultatet som en teckensträng istället för ett heltal. DATENAME()
returnerar också månad och veckodag som deras fullständiga namn, snarare än deras numeriska värde.
Exempel:
DECLARE @date datetime2 = '2018-06-02 08:24:14.3112042'; SELECT DATENAME(day, @date) AS DAY, DATENAME(weekday, @date) AS WEEKDAY, DATENAME(month, @date) AS MONTH, DATENAME(year, @date) AS YEAR;
Resultat:
+-------+-----------+---------+--------+ | DAY | WEEKDAY | MONTH | YEAR | |-------+-----------+---------+--------| | 2 | Saturday | June | 2018 | +-------+-----------+---------+--------+
För fler exempel på denna funktion, se DATENAME()
Exempel i SQL Server.
FORMAT()-funktionen
Vi kan använda FORMAT()
funktion för att returnera samma värden som med DATENAME()
funktion och mer.
Detta är en mer mångsidig funktion än de tidigare. Det låter dig formatera datum/tid samt numeriska värden som strängar. Returvärdet är antingen nvarchar eller null (beroende på inmatningen), och längden på strängen bestäms av det angivna formatet.
FORMAT()
ger också fler alternativ för hur datumdelen presenteras. Du kan ange om det ska visas som ett enda tecken, två tecken, tre, fyra och till och med fem i vissa fall.
Här är exempel att visa.
Dag
DECLARE @date datetime2 = '2018-06-02 08:24:14.3112042'; SELECT FORMAT(@date, 'd ') AS d, FORMAT(@date, 'dd') AS dd, FORMAT(@date, 'ddd') AS ddd, FORMAT(@date, 'dddd') AS dddd;
Resultat:
+-----+------+-------+----------+ | d | dd | ddd | dddd | |-----+------+-------+----------| | 2 | 02 | Sat | Saturday | +-----+------+-------+----------+
Månad
DECLARE @date datetime2 = '2018-06-02 08:24:14.3112042'; SELECT FORMAT(@date, 'M ') AS M, FORMAT(@date, 'MM') AS MM, FORMAT(@date, 'MMM') AS MMM, FORMAT(@date, 'MMMMM') AS MMMM;
Resultat:
+-----+------+-------+--------+ | M | MM | MMM | MMMM | |-----+------+-------+--------| | 6 | 06 | Jun | June | +-----+------+-------+--------+
År
DECLARE @date datetime2 = '2018-06-02 08:24:14.3112042'; SELECT FORMAT(@date, 'y ') AS y, FORMAT(@date, 'yy') AS yy, FORMAT(@date, 'yyy') AS yyy, FORMAT(@date, 'yyyy') AS yyyy, FORMAT(@date, 'yyyyy') AS yyyyy;
Resultat:
+-----+------+-------+--------+---------+ | y | yy | yyy | yyyy | yyyyy | |-----+------+-------+--------+---------| | 18 | 18 | 2018 | 2018 | 02018 | +-----+------+-------+--------+---------+
Observera att vi har möjlighet att formatera årsdelen som fem siffror.
Om antalet siffror
När en datumdel returneras i siffror, bestämmer formatspecifikationen det minsta antalet siffror som ska returneras. Till exempel när du använder yyy
, kommer året att returneras som tre siffror om året är 0008
men som fyra siffror om året är 2008
.
Exempel:
DECLARE @date datetime2 = '0008-06-02 08:24:14.3112042'; SELECT FORMAT(@date, 'y ') AS y, FORMAT(@date, 'yy') AS yy, FORMAT(@date, 'yyy') AS yyy, FORMAT(@date, 'yyyy') AS yyyy, FORMAT(@date, 'yyyyy') AS yyyyy;
Resultat:
+-----+------+-------+--------+---------+ | y | yy | yyy | yyyy | yyyyy | |-----+------+-------+--------+---------| | 8 | 08 | 008 | 0008 | 00008 | +-----+------+-------+--------+---------+
Även när du använder det enskilda alternativet (t.ex. d
) som datumspecifikator måste du lägga till ett mellanslag om du bara vill att datumdelen ska returneras av sig själv. Om du inte gör det här får du mer än den enda dateparten.
Exempel:
DECLARE @date datetime2 = '2008-06-02 08:24:14.3112042'; SELECT FORMAT(@date, 'd ') AS 'Space', FORMAT(@date, 'd') AS 'No Space', FORMAT(@date, 'M ') AS 'Space', FORMAT(@date, 'M') AS 'No Space', FORMAT(@date, 'y ') AS 'Space', FORMAT(@date, 'y') AS 'No Space';
Resultat:
+---------+------------+---------+------------+---------+------------+ | Space | No Space | Space | No Space | Space | No Space | |---------+------------+---------+------------+---------+------------| | 2 | 6/2/2008 | 6 | June 2 | 8 | June 2008 | +---------+------------+---------+------------+---------+------------+
För mer FORMAT()
exempel, se Hur man formaterar datum och tid i SQL Server.