DATEDIFF (Transact-SQL)DATEDIFF (Transact-SQL)

ESTE TEMA SE APLICA A: síSQL Server (a partir de 2008)síAzure SQL DatabasesíAzure SQL Data Warehouse síAlmacenamiento de datos paralelos THIS TOPIC APPLIES TO: yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

Esta función devuelve el recuento (como un valor entero con firma) de los límites datepart que se han cruzado entre los valores startdate y enddate especificados.This function returns the count (as a signed integer value) of the specified datepart boundaries crossed between the specified startdate and enddate.

Vea DATEDIFF_BIG (Transact-SQL) para obtener una función que controla las diferencias más importantes entre los valores startdate y enddate.See DATEDIFF_BIG (Transact-SQL) for a function that handles larger differences between the startdate and enddate values. Vea Tipos de datos y funciones de fecha y hora (Transact-SQL) para obtener información general sobre todos los tipos de datos y las funciones de fecha y hora de Transact-SQLTransact-SQL.See Date and Time Data Types and Functions (Transact-SQL) for an overview of all Transact-SQLTransact-SQL date and time data types and functions.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

DATEDIFF ( datepart , startdate , enddate )  

ArgumentosArguments

datepartdatepart
La parte de startdate y enddate que especifica el tipo de límite cruzado.The part of startdate and enddate that specifies the type of boundary crossed. DATEDIFF no aceptará los equivalentes de variables definidas por el usuario.DATEDIFF will not accept user-defined variable equivalents. En esta tabla se enumeran todos los argumentos válidos de datepart.This table lists all valid datepart arguments.

datepartdatepart AbreviaturasAbbreviations
yearyear yy, yyyyyy, yyyy
quarterquarter qq, qqq, q
monthmonth mm, mmm, m
dayofyeardayofyear dy, ydy, y
dayday dd, ddd, d
weekweek wk, wwwk, ww
hourhour hhhh
minuteminute mi, nmi, n
secondsecond ss, sss, s
millisecondmillisecond msms
microsecondmicrosecond mcsmcs
nanosecondnanosecond nsns

startdatestartdate
Una expresión que se puede resolver en uno de los valores siguientes:An expression that can resolve to one of the following values:

  • datedate
  • datetimedatetime
  • datetimeoffsetdatetimeoffset
  • datetime2datetime2
  • smalldatetimesmalldatetime
  • timetime

Para evitar ambigüedades, use años de cuatro dígitos.Use four-digit years to avoid ambiguity. Vea Establecer la opción de configuración del servidor Fecha límite de año de dos dígitos para obtener información sobre los valores de año de dos dígitos.See Configure the two digit year cutoff Server Configuration Option for information about two-digit year values.

enddateenddate
Vea startdate.See startdate.

Tipo devueltoReturn Type

intint

Valor devueltoReturn Value

  • Cada argumento datepart específico y las abreviaturas para ese argumento datepart devolverán el mismo valor.Each specific datepart and the abbreviations for that datepart will return the same value.

Para un valor devuelto fuera del intervalo de int (de -2.147.483.648 a +2.147.483.647) DATEDIFF devuelve un error.For a return value out of range for int (-2,147,483,648 to +2,147,483,647), DATEDIFF returns an error. En millisecond, la diferencia máxima entre startdate y enddate es de 24 días, 20 horas, 31 minutos y 23.647 segundos.For millisecond, the maximum difference between startdate and enddate is 24 days, 20 hours, 31 minutes and 23.647 seconds. En second, la diferencia máxima es de 68 años.For second, the maximum difference is 68 years.

Si startdate y enddate solo tienen asignado un valor de hora y datepart no es un valor datepart de hora, DATEDIFF devuelve 0.If startdate and enddate are both assigned only a time value, and the datepart is not a time datepart, DATEDIFF returns 0.

DATEDIFF no usa un componente de desplazamiento de zona horaria de startdate o enddate para calcular el valor devuelto.DATEDIFF does not use a time zone offset component of startdate or enddate to calculate the return value.

Como smalldatetime solo es preciso hasta los minutos, los segundos y milisegundos siempre se establecen en 0 en el valor devuelto cuando startdate o enddate tienen un valor smalldatetime.Because smalldatetime has accurate only to the minute, seconds and milliseconds are always set to 0 in the return value when startdate or enddate have a smalldatetime value.

Si solo se asigna un valor de hora a una variable de tipo de datos de fecha, DATEDIFF establece el valor de la parte de la fecha que falta en el valor predeterminado: 01-01-1900.If only a time value is assigned to a date data type variable, DATEDIFF sets the value of the missing date part to the default value: 1900-01-01. Si solo se asigna un valor de fecha a una variable de tipo de datos de fecha u hora, DATEDIFF establece el valor de la parte de la hora que falta en el valor predeterminado: 00:00:00.If only a date value is assigned to a variable of a time or date data type, DATEDIFF sets the value of the missing time part to the default value: 00:00:00. Si startdate o enddate solo tienen una parte de hora y el otro solo una parte de fecha, DATEDIFF establece las partes de hora y fecha que faltan en los valores predeterminados.If either startdate or enddate have only a time part and the other only a date part, DATEDIFF sets the missing time and date parts to the default values.

Si startdate y enddate tienen tipos de datos de fecha diferentes y uno tiene más partes de hora o precisión de fracciones de segundo que el otro, DATEDIFF establece las partes que faltan del otro en 0.If startdate and enddate have different date data types, and one has more time parts or fractional seconds precision than the other, DATEDIFF sets the missing parts of the other to 0.

Límites de datepartdatepart boundaries

Las instrucciones siguientes tienen los mismos valores startdate y enddate.The following statements have the same startdate and the same enddate values. Esas fechas son adyacentes y tienen una diferencia horaria de 0,0000001 segundos.Those dates are adjacent and they differ in time by .0000001 second. La diferencia entre startdate y enddate en cada instrucción cruza un límite de calendario u hora de su datepart.The difference between the startdate and enddate in each statement crosses one calendar or time boundary of its datepart. Cada instrucción devuelve 1.Each statement returns 1. Si startdate y enddate tienen valores de año diferentes pero tienen los mismos valores de semana del calendario, DATEDIFF devolverá 0 para datepart week.If startdate and enddate have different year values but they have the same calendar week values, DATEDIFF will return 0 for datepart week.

SELECT DATEDIFF(year,        '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(quarter,     '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(month,       '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(dayofyear,   '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(day,         '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(week,        '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(hour,        '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(minute,      '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(second,      '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(millisecond, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');

NotasRemarks

Use DATEDIFF en las cláusulas SELECT , WHERE, HAVING, GROUP BY y ORDER BY.Use DATEDIFF in the SELECT , WHERE, HAVING, GROUP BY and ORDER BY clauses.

DATEDIFF convierte implícitamente los literales de cadena como un tipo datetime2.DATEDIFF implicitly casts string literals as a datetime2 type. Esto significa que DATEDIFF no admite el formato año-día-mes cuando la fecha se pasa como una cadena.This means that DATEDIFF does not support the format YDM when the date is passed as a string. La cadena se debe convertir explícitamente a un tipo datetime o smalldatetime para poder usar el formato año-día-mes.You must explicitly cast the string to a datetime or smalldatetime type to use the YDM format.

La especificación de SET DATEFIRST no tiene efecto en DATEDIFF.Specifying SET DATEFIRST has no effect on DATEDIFF. DATEDIFF siempre usa el domingo como el primer día de la semana para garantizar que la función actúa de forma determinista.DATEDIFF always uses Sunday as the first day of the week to ensure the function operates in a deterministic way.

EjemplosExamples

En estos ejemplos se usan otros tipos de expresiones como argumentos para los parámetros startdate y enddate.These examples use different types of expressions as arguments for the startdate and enddate parameters.

A.A. Especificar las columnas para startdate y enddateSpecifying columns for startdate and enddate

En este ejemplo se calcula el número de límites de día que se cruzan entre las fechas en dos columnas de una tabla.This example calculates the number of day boundaries crossed between dates in two columns in a table.

CREATE TABLE dbo.Duration  
    (startDate datetime2, endDate datetime2);  

INSERT INTO dbo.Duration(startDate, endDate)  
    VALUES ('2007-05-06 12:10:09', '2007-05-07 12:10:09');  

SELECT DATEDIFF(day, startDate, endDate) AS 'Duration'  
    FROM dbo.Duration;  
-- Returns: 1  

B.B. Especificar las variables definidas por el usuario para startdate y enddateSpecifying user-defined variables for startdate and enddate

En este ejemplo, las variables definidas por el usuario actúan como argumentos para startdate y enddate.In this example, user-defined variables serve as arguments for startdate and enddate.

DECLARE @startdate datetime2 = '2007-05-05 12:10:09.3312722';  
DECLARE @enddate   datetime2 = '2007-05-04 12:10:09.3312722';   
SELECT DATEDIFF(day, @startdate, @enddate);  

C.C. Especificar las funciones de sistema escalares para startdate y enddateSpecifying scalar system functions for startdate and enddate

En este ejemplo se usan las funciones de sistema escalares como argumentos para startdate y enddate.This example uses scalar system functions as arguments for startdate and enddate.

SELECT DATEDIFF(millisecond, GETDATE(), SYSDATETIME());  

D.D. Especificar las funciones escalares y de subconsulta para startdate y enddateSpecifying scalar subqueries and scalar functions for startdate and enddate

En este ejemplo se usan las funciones escalares y de subconsulta como argumentos para startdate y enddate.This example uses scalar subqueries and scalar functions as arguments for startdate and enddate.

USE AdventureWorks2012;  
GO  
SELECT DATEDIFF(day,
    (SELECT MIN(OrderDate) FROM Sales.SalesOrderHeader),  
    (SELECT MAX(OrderDate) FROM Sales.SalesOrderHeader));  

E.E. Especificar las constantes para startdate y enddateSpecifying constants for startdate and enddate

En este ejemplo se usan constantes de caracteres como argumentos para startdate y enddate.This example uses character constants as arguments for startdate and enddate.

SELECT DATEDIFF(day,
   '2007-05-07 09:53:01.0376635',
   '2007-05-08 09:53:01.0376635');  

F.F. Especificar expresiones numéricas y funciones de sistema escalares para enddateSpecifying numeric expressions and scalar system functions for enddate

En este ejemplo se usa una expresión numérica, (GETDATE() + 1), y las funciones de sistema escalares GETDATE y SYSDATETIME, como argumentos para enddate.This example uses a numeric expression, (GETDATE() + 1), and scalar system functions GETDATE and SYSDATETIME, as arguments for enddate.

USE AdventureWorks2012;  
GO  
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635', GETDATE() + 1)   
    AS NumberOfDays  
    FROM Sales.SalesOrderHeader;  
GO  
USE AdventureWorks2012;  
GO  
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635', DATEADD(day, 1, SYSDATETIME())) AS NumberOfDays  
    FROM Sales.SalesOrderHeader;  
GO  

G.G. Especificar las funciones de clasificación para startdateSpecifying ranking functions for startdate

En este ejemplo se usa una función de categoría como argumento para startdate.This example uses a ranking function as an argument for startdate.

USE AdventureWorks2012;  
GO  
SELECT p.FirstName, p.LastName  
    ,DATEDIFF(day, ROW_NUMBER() OVER (ORDER BY   
        a.PostalCode), SYSDATETIME()) AS 'Row Number'  
FROM Sales.SalesPerson s   
    INNER JOIN Person.Person p   
        ON s.BusinessEntityID = p.BusinessEntityID  
    INNER JOIN Person.Address a   
        ON a.AddressID = p.BusinessEntityID  
WHERE TerritoryID IS NOT NULL   
    AND SalesYTD <> 0;  

H.H. Especificar una función de ventana agregada para startdateSpecifying an aggregate window function for startdate

En este ejemplo se usa una función de ventana agregada como argumento para startdate.This example uses an aggregate window function as an argument for startdate.

USE AdventureWorks2012;  
GO  
SELECT soh.SalesOrderID, sod.ProductID, sod.OrderQty, soh.OrderDate,
    DATEDIFF(day, MIN(soh.OrderDate)   
        OVER(PARTITION BY soh.SalesOrderID), SYSDATETIME()) AS 'Total'  
FROM Sales.SalesOrderDetail sod  
    INNER JOIN Sales.SalesOrderHeader soh  
        ON sod.SalesOrderID = soh.SalesOrderID  
WHERE soh.SalesOrderID IN(43659, 58918);  
GO  

Ejemplos: Almacenamiento de datos SQL de AzureAzure SQL Data Warehouse y Almacenamiento de datos paralelosParallel Data WarehouseExamples: Almacenamiento de datos SQL de AzureAzure SQL Data Warehouse and Almacenamiento de datos paralelosParallel Data Warehouse

En estos ejemplos se usan otros tipos de expresiones como argumentos para los parámetros startdate y enddate.These examples use different types of expressions as arguments for the startdate and enddate parameters.

I.I. Especificar las columnas para startdate y enddateSpecifying columns for startdate and enddate

En este ejemplo se calcula el número de límites de día que se cruzan entre las fechas en dos columnas de una tabla.This example calculates the number of day boundaries crossed between dates in two columns in a table.

CREATE TABLE dbo.Duration 
    (startDate datetime2, endDate datetime2);

INSERT INTO dbo.Duration (startDate, endDate)  
    VALUES ('2007-05-06 12:10:09', '2007-05-07 12:10:09');  

SELECT TOP(1) DATEDIFF(day, startDate, endDate) AS Duration  
    FROM dbo.Duration;  
-- Returns: 1  

J.J. Especificar las funciones escalares y de subconsulta para startdate y enddateSpecifying scalar subqueries and scalar functions for startdate and enddate

En este ejemplo se usan las funciones escalares y de subconsulta como argumentos para startdate y enddate.This example uses scalar subqueries and scalar functions as arguments for startdate and enddate.

-- Uses AdventureWorks  

SELECT TOP(1) DATEDIFF(day, (SELECT MIN(HireDate) FROM dbo.DimEmployee),  
    (SELECT MAX(HireDate) FROM dbo.DimEmployee))   
FROM dbo.DimEmployee;  

K.K. Especificar las constantes para startdate y enddateSpecifying constants for startdate and enddate

En este ejemplo se usan constantes de caracteres como argumentos para startdate y enddate.This example uses character constants as arguments for startdate and enddate.

-- Uses AdventureWorks  

SELECT TOP(1) DATEDIFF(day,
    '2007-05-07 09:53:01.0376635',
    '2007-05-08 09:53:01.0376635') FROM DimCustomer;  

L.L. Especificar las funciones de clasificación para startdateSpecifying ranking functions for startdate

En este ejemplo se usa una función de categoría como argumento para startdate.This example uses a ranking function as an argument for startdate.

-- Uses AdventureWorks  

SELECT FirstName, LastName,
    DATEDIFF(day, ROW_NUMBER() OVER (ORDER BY   
        DepartmentName), SYSDATETIME()) AS RowNumber  
FROM dbo.DimEmployee;  

M.M. Especificar una función de ventana agregada para startdateSpecifying an aggregate window function for startdate

En este ejemplo se usa una función de ventana agregada como argumento para startdate.This example uses an aggregate window function as an argument for startdate.

-- Uses AdventureWorks  

SELECT FirstName, LastName, DepartmentName,
    DATEDIFF(year, MAX(HireDate)  
        OVER (PARTITION BY DepartmentName), SYSDATETIME()) AS SomeValue  
FROM dbo.DimEmployee  

Vea tambiénSee also

DATEDIFF_BIG (Transact-SQL)DATEDIFF_BIG (Transact-SQL)
CAST y CONVERT (Transact-SQL)CAST and CONVERT (Transact-SQL)