datetime (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Define una fecha que se combina con una hora del día con fracciones de segundos basada en un reloj de 24 horas.

Nota

Use los tipos de datos time, date, datetime2 y datetimeoffset para nuevos trabajos. Estos tipos se alinean con el estándar SQL. Son más portátiles. time, datetime2 y datetimeoffset proporcionan una mayor precisión de segundos. datetimeoffset proporciona compatibilidad de zona horaria para las aplicaciones implementadas globalmente.

Descripción

Propiedad Value
Sintaxis datetime
Uso DECLARE @MyDatetime datetime

CREATE TABLE Table1 ( Column1 datetime )
Formatos de literal de cadena predeterminados

(se usa para el cliente de nivel inferior)
No aplicable
Intervalo de fechas Del 01.01.53 hasta el 31.12.99
Intervalo de horas De 00:00:00 a 23:59:59,997
Intervalo de ajuste de zona horaria Ninguno
Intervalos de elementos AAAA es una cifra de cuatro dígitos comprendida entre 1753 y 9999 que representa un año.

MM es una cifra de dos dígitos, comprendida entre 01 y 12, que representa un mes del año especificado.

DD es una cifra de dos dígitos, comprendida entre 01 y 31 dependiendo del mes, que representa un día del mes especificado.

hh es una cifra de dos dígitos comprendida entre 00 y 23 que representa la hora.

mm es una cifra de dos dígitos comprendida entre 00 y 59 que representa los minutos.

s es una cifra de dos dígitos comprendida entre 00 y 59 que representa los segundos.

n* es una cifra de cero a tres dígitos comprendida entre 0 y 999 que representa las fracciones de segundos.
Longitud en caracteres 19 posiciones como mínimo a 23 como máximo
Tamaño de almacenamiento 8 bytes
Precisión Se redondea en incrementos de 0,000, 0,003 o 0.007 segundos
Valor predeterminado 1900-01-01 00:00:00
Calendario Gregoriano (incluye el intervalo completo de años).
Precisión de fracciones de segundo definida por el usuario No
Conservación y reconocimiento del ajuste de zona horaria No
Reconocimiento del horario de verano No

Formatos del literales de cadena compatibles para datetime

En estas tablas se enumeran los formatos de literales de cadena compatibles para datetime. Excepto para ODBC, los literales de cadena de datetime están incluidos entre comillas simples ('), por ejemplo 'string_literaL'. Si el entorno no es us_english, los literales de cadena deberían estar en el formato N'string_literaL'.

Numeric Descripción
Formatos de fecha:

[0]4/15/[19]96 -- (mda)

[0]4-15-[19]96 -- (mda)

[0]4.15.[19]96 -- (mda)

[0]4/[19]96/15 -- (mad)

15/[0]4/[19]96 -- (dma)

15/[19]96/[0]4 -- (dam)

[19]96/15/[0]4 -- (adm)

[19]96/[0]4/15 -- (amd)

Formatos de hora:

14:30

14:30[:20:999]

14:30[:20.9]

4am

4 PM
Puede especificar datos de fecha con un mes en forma de número. Por ejemplo, 5/20/97 representa el veinte de mayo de 1997. Cuando use un formato numérico de fecha, especifique el mes, el día y el año en una cadena con barras diagonales (/), guiones (-) o puntos (.) como separadores. Esta cadena debe aparecer de la forma siguiente:

número separador número separador número [hora] [hora]



Cuando el idioma establecido es us_english, el orden predeterminado de la fecha es mdy (mes, día, año). Para cambiar el orden de la fecha, use la instrucción SET DATEFORMAT.

La configuración de SET DATEFORMAT determina cómo se interpretan los valores de fecha. Si el orden no coincide con la configuración, los valores no se interpretan como fechas. Las fechas desordenadas pueden interpretarse como fuera del intervalo o con valores erróneos. Por ejemplo, 12/10/08 se puede interpretar de seis formas distintas, en función de la configuración de DATEFORMAT. Un año en cuatro partes se interpreta como el año.
Alfabético Descripción
Abr[il] [15][,] 1996

Abr[il] 15[,] [19]96

Abr[il] 1996 [15]

[15] Abr[il][,] 1996

15 Abr[il][,][19]96

15 [19]96 abr[il]

[15] 1996 abr[il]

1996 ABR[IL] [15]

1996 [15] ABR[IL]
Puede especificar los datos de la fecha con un mes especificado como el nombre completo del mes. Por ejemplo, abril o la abreviatura del mes Abr especificada en el idioma actual; las comas son opcionales y se omite el uso de mayúsculas.

Éstas son algunas directrices para utilizar los formatos alfabéticos de fecha:

1) Incluya los datos de fecha y hora entre comillas simples ('). Para los idiomas distintos de inglés, utilice N'

2) Los caracteres que se incluyen entre corchetes son opcionales.

3) Si solo especifica los dos últimos dígitos del año, los valores inferiores a los dos últimos dígitos de la opción Fecha límite de año de dos dígitos pertenecen al mismo siglo que el año límite (vea Establecer la opción de configuración del servidor Fecha límite de año de dos dígitos). Los valores mayores o iguales que el valor de esta opción pertenecen al siglo anterior al año límite. Por ejemplo, si el valor de Fecha límite de año de dos dígitos es 2050 (el valor predeterminado), 25 se interpreta como 2025 y 50 se interpreta como 1950. Para evitar ambigüedades, use años de cuatro dígitos.

4) Si falta el día, se usa el primer día del mes.



El parámetro de sesión SET DATEFORMAT no se aplica cuando se especifica el mes de forma alfabética.
ISO 8601 Descripción
AAAA-MM-DDThh:mm:ss[.mmm]

AAAMMDD[ hh:mm:ss[.mmm]]
Ejemplos:

1) 2004-05-23T14:25:10

2) 2004-05-23T14:25:10.487



Para usar el formato ISO 8601, debe especificar cada elemento del formato, incluida la T, los dos puntos (:) y el punto (.) que se muestran en el formato.

Los corchetes indican que el componente de fracción de segundo es opcional. El componente de hora se especifica en el formato de 24 horas.

La T indica el inicio de la parte de la hora del valor de datetime.

La ventaja de utilizar el formato ISO 8601 es que se trata de un estándar internacional con una especificación que evita ambigüedades. Además, este formato no se ve afectado por la configuración de SET DATEFORMAT o SET LANGUAGE.
Sin separación Descripción
AAAAMMDD hh:mm:ss[.mmm]
ODBC Descripción
{ ts '1998-05-02 01:23:56.123' }

{ d '1990-10-02' }

{ t '13:33:41' }
La API de ODBC define secuencias de escape para representar valores de fecha y de hora que ODBC llama datos de marca de tiempo. La definición del lenguaje OLE DB (DBGUID-SQL) aceptada por el proveedor OLE DB de Microsoft para SQL Server también admite este formato de marca de tiempo de ODBC. Las aplicaciones que usan las API basadas en ODBC, OLE DB y ADO pueden usar este formato de marca de tiempo de ODBC para representar fechas y horas.

Las secuencias de escape de marca de tiempo de ODBC tienen el formato: { literal_type 'constant_value' }:



- literal_type especifica el tipo de secuencia de escape. Las marcas de tiempo tienen tres especificadores literal_type:
1) d = solo fecha
2) t = solo hora
3) ts = marca de tiempo (hora + fecha)



- 'constant_value' es el valor de la secuencia de escape. constant_value debe seguir estos formatos para cada literal_type.
d : aaaa-mm-dd
t : hh:mm:ss[.fff]
ts : aaaa-mm-dd hh:mm:ss[.fff]

Redondeo de precisión de las fracciones de segundo de datetime

Los valores de datetime se redondean con incrementos de 0,000; 0,003 o 0,007 segundos, como se muestra en esta tabla.

Valor especificado por el usuario Valor almacenado por el sistema
01/01/98 23:59:59.999 1998-01-02 00:00:00.000
01/01/98 23:59:59.995

01/01/98 23:59:59.996

01/01/98 23:59:59.997

01/01/98 23:59:59.998
1998-01-01 23:59:59.997
01/01/98 23:59:59.992

01/01/98 23:59:59.993

01/01/98 23:59:59.994
1998-01-01 23:59:59.993
01/01/98 23:59:59.990

01/01/98 23:59:59.991
1998-01-01 23:59:59.990

Compatibilidad con ANSI e ISO 8601

datetime no es compatible con ANSI o ISO 8601.

Convertir datos de fecha y hora

Cuando se convierte a los tipos de datos de fecha y hora, SQL Server rechaza todos los valores que no reconoce como fechas u horas. Para obtener más información sobre cómo usar las funciones CAST y CONVERT con datos de fecha y hora, vea CAST y CONVERT (Transact-SQL).

Convertir otros tipos de fecha y hora en el tipo de datos datetime

En esta sección se describe lo que ocurre cuando otros tipos de datos de fecha y hora se convierten en un tipo de datos datetime.

Cuando la conversión es desde date, se copian los valores de año, mes y día. El componente de hora se establece en 00:00:00.000. En el código siguiente se muestran los resultados de convertir un valor date en un valor datetime.

DECLARE @date date = '12-21-16';  
DECLARE @datetime datetime = @date;  
  
SELECT @datetime AS '@datetime', @date AS '@date';  
  
--Result  
--@datetime               @date  
------------------------- ----------  
--2016-12-21 00:00:00.000 2016-12-21  

Nota

En el ejemplo anterior se usa un formato de fecha específico de la región (MM-DD-AA).

DECLARE @date date = '12-21-16';

Puede actualizar el ejemplo para que coincida con el formato de su región.

También puede completar el ejemplo con el formato de fecha compatible con ISO 8601 (AAAA-MM-DD). Por ejemplo:

DECLARE @date date = '2016-12-21';  
DECLARE @datetime datetime = @date;  

SELECT @datetime AS '@datetime', @date AS '@date';  

Cuando la conversión es desde time(n), se copia el componente de hora y el componente de fecha se establece en "1900-01-01". Cuando la precisión de las fracciones del valor de time(n) sea superior a tres dígitos, el valor se truncará para ajustarse. En el siguiente ejemplo se muestran los resultados de convertir un valor time(4) en un valor datetime.

DECLARE @time time(4) = '12:10:05.1237';  
DECLARE @datetime datetime = @time;  
  
SELECT @datetime AS '@datetime', @time AS '@time';  
  
--Result  
--@datetime               @time  
------------------------- -------------  
--1900-01-01 12:10:05.123 12:10:05.1237  

Cuando la conversión es desde smalldatetime, se copian las horas y los minutos. Los segundos y las fracciones de segundo se establecen en 0. En el código siguiente se muestran los resultados de convertir un valor smalldatetime en un valor datetime.

DECLARE @smalldatetime smalldatetime = '12-01-16 12:32';  
DECLARE @datetime datetime = @smalldatetime;  
  
SELECT @datetime AS '@datetime', @smalldatetime AS '@smalldatetime';  
  
--Result  
--@datetime               @smalldatetime  
------------------------- -----------------------  
--2016-12-01 12:32:00.000 2016-12-01 12:32:00  

Cuando la conversión es desde datetimeoffset(n), se copian los componentes de fecha y hora. Se trunca la zona horaria. Cuando la precisión de las fracciones del valor de datetimeoffset(n) sea superior a tres dígitos, el valor se truncará. En el siguiente ejemplo se muestran los resultados de convertir un valor datetimeoffset(4) en un valor datetime.

DECLARE @datetimeoffset datetimeoffset(4) = '1968-10-23 12:45:37.1234 +10:0';  
DECLARE @datetime datetime = @datetimeoffset;  
  
SELECT @datetime AS '@datetime', @datetimeoffset AS '@datetimeoffset';  
  
--Result  
--@datetime               @datetimeoffset  
------------------------- ------------------------------  
--1968-10-23 12:45:37.123 1968-10-23 12:45:37.1237 +10:0   

Cuando la conversión es desde datetime2(n), se copian la fecha y la hora. Cuando la precisión de las fracciones del valor de datetime2(n) sea superior a tres dígitos, el valor se truncará. En el siguiente ejemplo se muestran los resultados de convertir un valor datetime2(4) en un valor datetime.

DECLARE @datetime2 datetime2(4) = '1968-10-23 12:45:37.1237';  
DECLARE @datetime datetime = @datetime2;  
  
SELECT @datetime AS '@datetime', @datetime2 AS '@datetime2';  
  
--Result  
--@datetime               @datetime2  
------------------------- ------------------------  
--1968-10-23 12:45:37.123 1968-10-23 12:45:37.1237  

Ejemplos

En el siguiente ejemplo se comparan los resultados de convertir una cadena a cada tipo de datos date y time.

SELECT   
     CAST('2007-05-08 12:35:29. 1234567 +12:15' AS time(7)) AS 'time'   
    ,CAST('2007-05-08 12:35:29. 1234567 +12:15' AS date) AS 'date'   
    ,CAST('2007-05-08 12:35:29.123' AS smalldatetime) AS   
        'smalldatetime'   
    ,CAST('2007-05-08 12:35:29.123' AS datetime) AS 'datetime'   
    ,CAST('2007-05-08 12:35:29. 1234567 +12:15' AS datetime2(7)) AS   
        'datetime2'  
    ,CAST('2007-05-08 12:35:29.1234567 +12:15' AS datetimeoffset(7)) AS   
        'datetimeoffset';  

El conjunto de resultados es el siguiente:

Tipo de datos Output
time 12:35:29. 1234567
date 2007-05-08
smalldatetime 2007-05-08 12:35:00
datetime 2007-05-08 12:35:29.123
datetime2 2007-05-08 12:35:29. 1234567
datetimeoffset 2007-05-08 12:35:29.1234567 +12:15

Consulte también

CAST y CONVERT (Transact-SQL)