I SQL Server kan du använda DATEADD()
funktion för att lägga till en angiven tidsperiod till ett givet datum. Du kan också använda den för att subtrahera en viss tidsperiod.
Du kan också kombinera DATEADD()
med andra funktioner för att formatera datumet efter behov. Du kan till exempel ta "2020-10-03", lägga till 10 år och sedan returnera den (ökade) årskomponenten.
Den här artikeln innehåller exempel att visa.
Syntax
Syntaxen för DATEADD()
går så här:
DATEADD (datepart , number , date )
Där datepart
är den del av datumet du vill ökas (eller minskas), number
är det belopp som ska ökas datepart
av och date
är det datum till vilket tillägget kommer att ske.
Exempel 1
Här är ett grundläggande exempel på att lägga till tio år till ett datum:
SELECT DATEADD(year, 10, '2020-10-03') AS 'Future Date';
Resultat:
+-------------------------+ | Future Date | |-------------------------| | 2030-10-03 00:00:00.000 | +-------------------------+
I det här fallet inkluderar returvärdet såväl tidskomponenten som datumet. Detta beror på att resultatet returneras som en datumtid värde. Anledningen till att den returneras som denna datatyp är att vi har angett en bokstavlig sträng som date
argument. När du anger en bokstavlig sträng som datum, DATEADD()
returnerar en datumtid värde.
I de fall du inte anger en bokstavlig sträng är returvärdet detsamma som datatypen för date
argument. Till exempel om du anger en datetime2 argumentet kommer returvärdet att vara datetime2 .
Exempel 2 – Formatera resultatet
Vi kan ta resultatet ovan och formatera det med FORMAT()
funktion:
SELECT FORMAT(DATEADD(year, 10, '2020-10-03'), 'yyyy-MM-dd') AS 'yyyy-MM-dd', FORMAT(DATEADD(year, 10, '2020-10-03'), 'dd/MM/yyyy') AS 'dd/MM/yyyy', FORMAT(DATEADD(year, 10, '2020-10-03'), 'yyyy') AS 'yyyy', FORMAT(DATEADD(year, 10, '2020-10-03'), 'yy') AS 'yy';
Resultat:
+--------------+--------------+--------+------+ | yyyy-MM-dd | dd/MM/yyyy | yyyy | yy | |--------------+--------------+--------+------| | 2030-10-03 | 03/10/2030 | 2030 | 30 | +--------------+--------------+--------+------+
Men det är viktigt att notera att FORMAT()
funktion returnerar sitt resultat som en sträng.
Ett annat alternativ är att använda CONVERT()
för att konvertera resultatet till ett datum datatyp:
SELECT CONVERT(date, DATEADD(year, 10, '2020-10-03')) AS Converted;
Resultat:
+-------------+ | Converted | |-------------| | 2030-10-03 | +-------------+
Eller så kan du använda en funktion som YEAR()
, som returnerar resultatet som ett heltal:
SELECT YEAR(DATEADD(year, 10, '2020-10-03')) AS 'Future Year';
Resultat:
+---------------+ | Future Year | |---------------| | 2030 | +---------------+
Exempel 3 – Subtrahera datum
Du kan använda negativa tal för att subtrahera från datumet:
SELECT DATEADD(year, -10, '2020-10-03') AS 'Earlier Date';
Resultat:
+-------------------------+ | Earlier Date | |-------------------------| | 2010-10-03 00:00:00.000 | +-------------------------+
Och naturligtvis kan du formatera detta med någon av metoderna som nämnts tidigare.
Exempel 4 – Systemdatum
Här är några exempel på hur man använder olika funktioner för att returnera aktuellt datum/tid från datorn där instansen av SQL Server körs.
SYSDATETIME()
SELECT SYSDATETIME() AS 'Current Date', DATEADD(year, 10, SYSDATETIME()) AS 'Future Date';
Resultat:
+-----------------------------+-----------------------------+ | Current Date | Future Date | |-----------------------------+-----------------------------| | 2018-06-04 05:57:51.7297042 | 2028-06-04 05:57:51.7297042 | +-----------------------------+-----------------------------+
SYSDATETIMEOFFSET()
SELECT SYSDATETIME() AS 'Current Date', DATEADD(year, 10, SYSDATETIME()) AS 'Future Date';
Resultat:
+--------------------------+--------------------------+ | Current Date | Future Date | |--------------------------+--------------------------| | 4/6/18 6:02:07 am +00:00 | 4/6/28 6:02:07 am +00:00 | +--------------------------+--------------------------+
Som nämnts returneras dessa resultat med datatypen date
argument (eftersom de inte är bokstavliga strängar).
Formatera utdata
SELECT YEAR(SYSDATETIME()) AS 'Current Year', YEAR(DATEADD(year, 10, SYSDATETIME())) AS 'Future Year';
Resultat:
+----------------+---------------+ | Current Year | Future Year | |----------------+---------------| | 2018 | 2028 | +----------------+---------------+
Och som också nämnt, om du formaterar datumet kommer det att returneras i datatypen för den tillämpliga funktionen. Så i det här exemplet returneras resultatet som en int . Om vi hade formaterat den med FORMAT()
funktion, skulle den returneras som en sträng.