sql >> Databáze >  >> RDS >> Sqlserver

Příklady DATEDIFF() v SQL Server

V SQL Server můžete použít T-SQL DATEDIFF() funkce, která vrátí rozdíl mezi dvěma daty/časy. Funguje na jakýkoli výraz, který lze vyřešit na časdatumsmalldatetimedatum a časdatetime2 nebo datetimeoffset hodnota.

Tento článek obsahuje příklady DATEDIFF() funkce na serveru SQL.

Syntaxe

Nejprve je zde syntaxe:

DATEDIFF ( datepart , startdate , enddate )

Kde datepart je část data, kterou chcete porovnat. počáteční datum je první datum a koncové datum je datum ukončení.

Funguje to tak, že vrací počet (jako hodnotu celého čísla se znaménkem) zadaného datepart hranice překročeny mezi zadaným počátečním datem a datum ukončení .

Příklad 1

Zde je základní příklad, kde zjistíme počet dní mezi dvěma daty:

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

Výsledek:

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

Příklad 2

Zde je další příklad, kdy deklaruji dvě proměnné a přiřadím jim dvě různá data (používám DATEADD() přidat 1 rok k prvnímu datu). Potom použiji DATEDIFF() pro vrácení různých částí data pro toto datum:

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;

Výsledek:

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

Příklad 3

Jak již bylo zmíněno, můžete také vrátit časové části mezi daty. Zde je příklad vrácení počtu hodin, minut a sekund mezi hodnotami data/času:

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;

Výsledek:

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

Příklad 4

A zde je příklad získání počtu milisekund, mikrosekund a nanosekund mezi dvěma hodnotami data/času:

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;

Výsledek:

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

Příklad 5 – Chyba!

Pokud se pokusíte udělat něco extrémního, například vrátit počet nanosekund za 100 let, dostanete chybu. Důvodem je DATEDIFF() vrátí int a za 100 let je více nanosekund než int datový typ zvládne.

Takže pokud se o to pokusíte, stane se toto:

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;

Výsledek:

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. 

Naštěstí, pokud opravdu potřebujete zjistit, kolik nanosekund je za 100 let, můžete použít DATEDIFF_BIG() místo toho funkci. Tato funkce vrací bigint se znaménkem datový typ, který umožňuje vrátit mnohem větší hodnoty než DATEDIFF() může.

Příklad 6 – Získáváte divné výsledky?

Výsledky, které získáte z DATEDIFF() může někdy vypadat úplně špatně, pokud nevíte, jak funkce skutečně funguje.

Například:

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;

Výsledek:

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

Pokud nevíte, jak DATEDIFF() skutečně funguje, tento výsledek by mohl vypadat tak špatně, že by vám bylo odpuštěno za předpokladu, že se jedná o chybu. Ale to není chyba.

Podívejte se na DATEDIFF() vrací nesprávné výsledky v SQL Server? Přečti si tohle. vidět tento příklad a další případy, kdy výsledky mohou vypadat úplně špatně, ale být naprosto správné (a vysvětlení, proč vypadají tak, jak vypadají).

Jeden z příkladů na této stránce zde pravděpodobně stojí za zmínku. DATEDIFF() ve skutečnosti ignoruje váš SET DATEFIRST hodnota. To může vést k neočekávaným výsledkům, zvláště pokud jste v kultuře, která nepoužívá neděli jako první den v týdnu. Podívejte se na toto zástupné řešení pro DATEDIFF() Ignorování SET DATEFIRST na serveru SQL, pokud si myslíte, že by vás to mohlo ovlivnit.


  1. Prohlášení FORALL s vázanou doložkou VALUES-OF v databázi Oracle

  2. SQL Server Internals:Problematic Operators Pt. I – Skenování

  3. Jak vytvořit uživatele pro db v postgresql?

  4. postgresql - počet (žádné hodnoty null) každého sloupce v tabulce