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

DATEDIFF_BIG() Příklady v SQL Server

V SQL Server můžete použít DATEDIFF_BIG() místo funkce DATEDIFF() funkce, pokud očekáváte, že vrácená hodnota bude opravdu velká. Pokud se například snažíte zjistit, kolik milisekund je za 1000 let, dostanete chybu.

Je to proto, že DATEDIFF() vrátí int datový typ a výsledek je příliš velký na to, aby jej tento datový typ zvládl. Na druhé straně DATEDIFF_BIG() funkce vrací bigint se znaménkem datový typ, což znamená, že jej můžete použít k vrácení mnohem větších hodnot. Jinými slovy, můžete použít s mnohem větším rozsahem dat.

Kromě toho mezi těmito dvěma funkcemi není žádný rozdíl.

Tento článek poskytuje příklady použití DATEDIFF_BIG() funkce na serveru SQL.

Syntaxe

Nejprve je zde syntaxe:

DATEDIFF_BIG ( 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í.

Funkce odečte počáteční datum od koncového data .

Funguje to tak, že vrací počet (jako hodnotu velkého 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í .

Toto je přesně stejná syntaxe, která se používá u DATEDIFF() funkce.

Příklad 1

Toto je základní příklad demonstrující, jak to funguje.

SELECT DATEDIFF_BIG(day, '0001-01-01', '9002-01-01') AS Result;

Výsledek:

+----------+
| Result   |
|----------|
| 3287547  |
+----------+

Všimněte si, že v tomto případě jsme mohli použít DATEDIFF() , protože výsledek není příliš velký na celé číslo.

Příklad 2

Zde je příklad, kdy vrátíme rozdíl různých částí data ze dvou dat. V tomto případě deklaruji dvě proměnné a přiřadím jim dvě různá data (používám DATEADD() funkce pro přidání 1000 let k prvnímu datu):

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

Výsledek:

+---------+------------+----------+---------+-------------+--------+
| Years   | Quarters   | Months   | Weeks   | DayOfYear   | Days   |
|---------+------------+----------+---------+-------------+--------|
| 1000    | 4000       | 12000    | 52178   | 365243      | 365243 |
+---------+------------+----------+---------+-------------+--------+

Opět jsme mohli použít DATEDIFF() , protože žádný z výsledků není příliš velký na celé číslo.

Příklad 3

V tomto příkladu vrátíme hodiny, minuty a sekundy mezi dvěma daty:

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

Výsledek:

+---------+-----------+-------------+
| Hours   | Minutes   | Seconds     |
|---------+-----------+-------------|
| 8765832 | 525949920 | 31556995200 |
+---------+-----------+-------------+

Nyní jsme v bodě, kde DATEDIFF() by vrátil chybu. Počet sekund je pro int příliš velký (ale ne pro velké ).

Příklad 4

A nakonec je zde příklad s milisekundami, mikrosekundami a nanosekundami:

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

Výsledek:

+----------------+------------------+---------------------+
| Milliseconds   | Microseconds     | Nanoseconds         |
|----------------+------------------+---------------------|
| 3155760000000  | 3155760000000000 | 3155760000000000000 |
+----------------+------------------+---------------------+

V tomto případě jasně vidíme výhodu DATEDIFF_BIG() má více než DATEDIFF() . DATEDIFF() by se převrátily všechny tři.


  1. Spusťte nativní SQL s hibernací

  2. Jak mohu urychlit dotaz MySQL s velkým posunem v klauzuli LIMIT?

  3. Postgresql Aktuální časové razítko při aktualizaci

  4. Znovu vytvořte špatný uzel RAC