sql >> Database >  >> RDS >> Sqlserver

DATEDIFF() Voorbeelden in SQL Server

In SQL Server kunt u de T-SQL DATEDIFF() . gebruiken functie om het verschil tussen twee datums/tijden te retourneren. Het werkt op elke expressie die kan worden opgelost tot een tijddatumsmalldatetimedatumtijddatetime2 , of datetimeoffset waarde.

Dit artikel geeft voorbeelden van de DATEDIFF() functie in SQL Server.

Syntaxis

Ten eerste, hier is de syntaxis:

DATEDIFF ( datepart , startdate , enddate )

Waar datepart is het deel van de datum dat u wilt vergelijken. startdatum is de eerste datum en einddatum is de einddatum.

De manier waarop het werkt, is dat het de telling retourneert (als een geheel getal met teken) van het opgegeven datepart grenzen overschreden tussen de opgegeven startdatum en einddatum .

Voorbeeld 1

Hier is een eenvoudig voorbeeld waarbij we het aantal dagen tussen twee datums achterhalen:

SELECT DATEDIFF(day, '2001-01-01', '2002-01-01') AS Result;

Resultaat:

+----------+
| Result   |
|----------|
| 365      |
+----------+

Voorbeeld 2

Hier is nog een voorbeeld waarbij ik twee variabelen declareer en er twee verschillende datums aan toewijs (ik gebruik DATEADD() om 1 jaar toe te voegen aan de eerste datum). Ik gebruik dan DATEDIFF() om verschillende datumdelen voor die datum te retourneren:

DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000';
DECLARE @date2 datetime2 = DATEADD(year, 1, @date1);
SELECT 
    DATEDIFF( year, @date1, @date2 ) AS Years,
    DATEDIFF( quarter, @date1, @date2 ) AS Quarters,
    DATEDIFF( month, @date1, @date2 ) AS Months,
    DATEDIFF( week, @date1, @date2 ) AS Weeks,
    DATEDIFF( dayofyear, @date1, @date2 ) AS DayOfYear,
    DATEDIFF( day, @date1, @date2 ) AS Days;

Resultaat:

+---------+------------+----------+---------+-------------+--------+
| Years   | Quarters   | Months   | Weeks   | DayOfYear   | Days   |
|---------+------------+----------+---------+-------------+--------|
| 1       | 4          | 12       | 53      | 366         | 366    |
+---------+------------+----------+---------+-------------+--------+

Voorbeeld 3

Zoals vermeld, kunt u ook de tijdsdelen tussen de datums retourneren. Hier is een voorbeeld van het retourneren van het aantal uren, minuten en seconden tussen de datum/tijd-waarden:

DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000';
DECLARE @date2 datetime2 = DATEADD(hour, 1, @date1);
SELECT 
    DATEDIFF( hour, @date1, @date2 ) AS Hours,
    DATEDIFF( minute, @date1, @date2 ) AS Minutes,
    DATEDIFF( second, @date1, @date2 ) AS Seconds;

Resultaat:

+---------+-----------+-----------+
| Hours   | Minutes   | Seconds   |
|---------+-----------+-----------|
| 1       | 60        | 3600      |
+---------+-----------+-----------+

Voorbeeld 4

En hier is een voorbeeld van het verkrijgen van het aantal milliseconden, microseconden en nanoseconden tussen twee datum/tijd-waarden:

DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000';
DECLARE @date2 datetime2 = DATEADD(millisecond, 1, @date1);
SELECT    
    DATEDIFF( millisecond, @date1, @date2 ) AS Milliseconds,
    DATEDIFF( microsecond, @date1, @date2 ) AS Microseconds,
    DATEDIFF( nanosecond, @date1, @date2 ) AS Nanoseconds;

Resultaat:

+----------------+----------------+---------------+
| Milliseconds   | Microseconds   | Nanoseconds   |
|----------------+----------------+---------------|
| 1              | 1000           | 1000000       |
+----------------+----------------+---------------+

Voorbeeld 5 – Fout!

Als je iets extreems probeert te doen, zoals het aantal nanoseconden in 100 jaar teruggeven, krijg je een foutmelding. Dit komt omdat DATEDIFF() retourneert een int waarde, en er zijn meer nanoseconden in 100 jaar dan de int gegevenstype aankan.

Dus dit is wat er gebeurt als je dat probeert:

DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000';
DECLARE @date2 datetime2 = DATEADD(year, 100, @date1);
SELECT    
    DATEDIFF( millisecond, @date1, @date2 ) AS Milliseconds,
    DATEDIFF( microsecond, @date1, @date2 ) AS Microseconds,
    DATEDIFF( nanosecond, @date1, @date2 ) AS Nanoseconds;

Resultaat:

The datediff function resulted in an overflow. The number of dateparts separating two date/time instances is too large. Try to use datediff with a less precise datepart. 

Gelukkig, als je echt moet weten hoeveel nanoseconden er in 100 jaar zijn, kun je de DATEDIFF_BIG() gebruiken in plaats daarvan functioneren. Deze functie retourneert een ondertekende bigint gegevenstype, waarmee u veel grotere waarden kunt retourneren dan DATEDIFF() kan.

Voorbeeld 6 – Krijgt u rare resultaten?

De resultaten die u krijgt van DATEDIFF() kan er soms helemaal verkeerd uitzien als je niet weet hoe de functie echt werkt.

Bijvoorbeeld:

DECLARE 
  @startdate datetime2 = '2016-01-01  00:00:00.0000000', 
  @enddate datetime2 = '2016-12-31 23:59:59.9999999';
SELECT 
  DATEDIFF(day, @startdate, @enddate) Days,
  DATEDIFF(year, @startdate, @enddate) Years;

Resultaat:

+--------+---------+
| Days   | Years   |
|--------+---------|
| 365    | 0       |
+--------+---------+

Als je niet weet hoe DATEDIFF() echt werkt, kan dit resultaat er zo verkeerd uitzien, dat het je vergeven zou worden als je aanneemt dat het een bug is. Maar het is geen bug.

Bekijk DATEDIFF() Geeft verkeerde resultaten in SQL Server? Lees dit. om dit voorbeeld en andere gevallen te zien waarin de resultaten er helemaal verkeerd uit kunnen zien, maar volkomen correct zijn (en voor een verklaring waarom ze er zo uitzien).

Een van de voorbeelden op die pagina is waarschijnlijk het vermelden waard hier nog eens. DATEDIFF() negeert feitelijk uw SET DATEFIRST waarde. Dit kan onverwachte resultaten opleveren, vooral als je in een cultuur zit die de zondag niet als eerste dag van de week gebruikt. Bekijk deze tijdelijke oplossing voor DATEDIFF() door SET DATEFIRST in SQL Server te negeren als u denkt dat dit gevolgen voor u kan hebben.


  1. Audit van gegevenswijzigingen uitvoeren met behulp van een tijdelijke tabel

  2. De stap Unpivot gebruiken om een ​​tabel in tabelvorm te maken van een kruistabel

  3. Slaapstand:Index maken

  4. invoerbestand lijkt een dump in tekstformaat te zijn. Gebruik alstublieft psql