Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

DATEDIFF() Exemples dans SQL Server

Dans SQL Server, vous pouvez utiliser le T-SQL DATEDIFF() fonction pour retourner la différence entre deux dates/heures. Cela fonctionne sur n'importe quelle expression qui peut être résolue en un tempsdatepetite date/heuredateheuredateheure2 , ou datetimeoffset valeur.

Cet article fournit des exemples de DATEDIFF() fonction dans SQL Server.

Syntaxe

Tout d'abord, voici la syntaxe :

DATEDIFF ( datepart , startdate , enddate )

datepart est la partie de la date que vous voulez comparer. date de début est la première date et la date de fin est la date de fin.

La façon dont cela fonctionne est qu'il renvoie le nombre (sous la forme d'une valeur entière signée) de la partie de date spécifiée frontières franchies entre la date de début spécifiée et date de fin .

Exemple 1

Voici un exemple basique où l'on connaît le nombre de jours entre deux dates :

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

Résultat :

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

Exemple 2

Voici un autre exemple où je déclare deux variables et leur attribue deux dates différentes (j'utilise DATEADD() ajouter 1 an à la première date). J'utilise ensuite DATEDIFF() pour renvoyer différentes parties de date pour cette date :

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;

Résultat :

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

Exemple 3

Comme mentionné, vous pouvez également renvoyer les parties temporelles entre les dates. Voici un exemple de renvoi du nombre d'heures, de minutes et de secondes entre les valeurs de date/heure :

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;

Résultat :

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

Exemple 4

Et voici un exemple d'obtention du nombre de millisecondes, microsecondes et nanosecondes entre deux valeurs de date/heure :

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;

Résultat :

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

Exemple 5 – Erreur !

Si vous essayez de faire quelque chose d'extrême, comme renvoyer le nombre de nanosecondes en 100 ans, vous obtiendrez une erreur. C'est parce que DATEDIFF() renvoie un int valeur, et il y a plus de nanosecondes en 100 ans que le int type de données peut gérer.

Voici donc ce qui se passe si vous essayez de le faire :

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;

Résultat :

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. 

Heureusement, si vous devez vraiment savoir combien de nanosecondes sont dans 100 ans, vous pouvez utiliser le DATEDIFF_BIG() fonction à la place. Cette fonction renvoie un bigint signé type de données, qui vous permet de renvoyer des valeurs beaucoup plus grandes que DATEDIFF() peut.

Exemple 6 – Obtenir des résultats étranges ?

Les résultats que vous obtenez de DATEDIFF() peut parfois sembler complètement faux si vous ne savez pas comment la fonction fonctionne réellement.

Par exemple :

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;

Résultat :

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

Si vous ne savez pas comment DATEDIFF() fonctionne réellement, ce résultat pourrait sembler si faux que vous seriez pardonné de supposer qu'il s'agit d'un bogue. Mais ce n'est pas un bug.

Découvrez DATEDIFF() renvoie des résultats erronés dans SQL Server ? Lis ça. pour voir cet exemple et d'autres cas où les résultats peuvent sembler complètement faux, mais être parfaitement corrects (et pour une explication sur la raison pour laquelle ils ont l'air comme ils le font).

L'un des exemples de cette page mérite probablement d'être mentionné à nouveau ici. DATEDIFF() ignore en fait votre SET DATEFIRST valeur. Cela peut entraîner des résultats inattendus, surtout si vous êtes dans une culture qui n'utilise pas le dimanche comme premier jour de la semaine. Consultez cette solution de contournement pour DATEDIFF() ignorant SET DATEFIRST dans SQL Server si vous pensez que cela pourrait vous affecter.