sql >> Base de Datos >  >> RDS >> Sqlserver

DATEDIFF() Ejemplos en SQL Server

En SQL Server, puede usar T-SQL DATEDIFF() función para devolver la diferencia entre dos fechas/horas. Funciona en cualquier expresión que se pueda resolver en un tiempofechapequeña fecha y horafechahorafechahora2desplazamiento de fecha y hora valor.

Este artículo proporciona ejemplos de DATEDIFF() función en SQL Server.

Sintaxis

Primero, aquí está la sintaxis:

DATEDIFF ( datepart , startdate , enddate )

Donde datepart es la parte de la fecha que desea comparar. fecha de inicio es la primera fecha y enddate es la fecha de finalización.

La forma en que funciona es que devuelve el recuento (como un valor entero con signo) del datepart especificado. límites cruzados entre la startdate especificada y fecha de finalización .

Ejemplo 1

Aquí hay un ejemplo básico donde encontramos el número de días entre dos fechas:

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

Resultado:

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

Ejemplo 2

Aquí hay otro ejemplo donde declaro dos variables y les asigno dos fechas diferentes (uso DATEADD() para agregar 1 año a la primera fecha). Luego uso DATEDIFF() para devolver varias partes de fecha para esa fecha:

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;

Resultado:

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

Ejemplo 3

Como se mencionó, también puede devolver las partes de tiempo entre las fechas. Este es un ejemplo de devolución del número de horas, minutos y segundos entre los valores de fecha/hora:

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;

Resultado:

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

Ejemplo 4

Y aquí hay un ejemplo de cómo obtener la cantidad de milisegundos, microsegundos y nanosegundos entre dos valores de fecha/hora:

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;

Resultado:

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

Ejemplo 5:¡Error!

Si intenta hacer algo extremo, como devolver la cantidad de nanosegundos en 100 años, obtendrá un error. Esto se debe a que DATEDIFF() devuelve un int valor, y hay más nanosegundos en 100 años que el int tipo de datos puede manejar.

Entonces, esto es lo que sucede si intentas hacer eso:

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;

Resultado:

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. 

Afortunadamente, si realmente debe averiguar cuántos nanosegundos hay en 100 años, puede usar el DATEDIFF_BIG() función en su lugar. Esta función devuelve un bigint firmado tipo de datos, que le permite devolver valores mucho más grandes que DATEDIFF() puede.

Ejemplo 6:¿Obtienes resultados extraños?

Los resultados que obtienes de DATEDIFF() a veces puede parecer completamente incorrecto si no sabe cómo funciona realmente la función.

Por ejemplo:

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;

Resultado:

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

Si no sabe cómo DATEDIFF() realmente funciona, este resultado podría parecer tan erróneo que se le perdonaría asumir que se trata de un error. Pero no es un error.

Consulte DATEDIFF () ¿Devuelve resultados incorrectos en SQL Server? Lee esto. para ver este ejemplo y otros casos en los que los resultados pueden parecer completamente erróneos, pero ser perfectamente correctos (y para obtener una explicación de por qué se ven de la forma en que se ven).

Uno de los ejemplos en esa página probablemente valga la pena mencionarlo nuevamente aquí. DATEDIFF() en realidad ignora su SET DATEFIRST valor. Esto puede generar resultados inesperados, especialmente si se encuentra en una cultura que no usa el domingo como el primer día de la semana. Consulte esta solución alternativa para DATEDIFF() Ignorar SET DATEFIRST en SQL Server si cree que esto podría afectarlo.