Compartir a través de


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.

Evite usar datetime para el nuevo trabajo. En su lugar, use los tipos de datos time, date, datetime2 y datetimeoffset. Estos tipos se alinean con SQL Standard y 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 literales de cadena predeterminados (usados para el cliente de nivel anterior) No aplicable
Intervalo de fechas 1753-01-01 (1 de enero de 1753) a 9999-12-31 (31 de diciembre de 9999)
Intervalo de tiempo De 00:00:00 a 23:59:59,997
Intervalo de desplazamiento de zona horaria Ninguno
Intervalos de elementos yyyy es de cuatro dígitos que 17539999 representan un año.

MM es dos dígitos, que van de 01 a 12, que representan un mes en el año especificado.

dd es de dos dígitos, que van desde 01 hasta 31 según el mes, que representa un día del mes especificado.

HH es de dos dígitos, que van de 00 a 23, que representan la hora.

mm es de dos dígitos, que van de 00 a 59, que representan el minuto.

ss es de dos dígitos, que van de 00 a 59, que representan el segundo.

n* es cero a tres dígitos, que van de 0 a 999, que representan las fracciones de segundos.
Longitud de caracteres 19 posiciones como mínimo a 23 como máximo
Tamaño de almacenamiento 8 bytes
Precisión Redondeado a incrementos de .000, .003o .007 segundos
Valor predeterminado 1900-01-01 00:00:00
Calendario Gregoriano (incluye la gama completa de años)
Precisión de segundo fraccionario definida por el usuario No
Reconocimiento y conservación del desplazamiento 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 datetime están entre comillas simples ('), por ejemplo, 'string_literaL'. Si el entorno no us_englishes , los literales de cadena deben tener el formato N'string_literaL'Unicode .

Formato numérico

Puede especificar datos de fecha con un mes en forma de número. Por ejemplo, 5/20/97 representa el xx día de mayo de 1997. Cuando se usa el formato de fecha numérica, especifique el mes, el día y el año en una cadena que use marcas de barra diagonal (), guiones (/-) o puntos (.) como separadores. Esta cadena debe aparecer de la forma siguiente:

<number separator number separator number [time] [time]>

Cuando el idioma se establece us_englishen , 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. Es posible que las fechas desordenadas se malinterpreten como fuera del intervalo o con valores incorrectos. Por ejemplo, 12/10/08 se puede interpretar como una de seis fechas, dependiendo de la DATEFORMAT configuración. Un año en cuatro partes se interpreta como el año.

Formato de fecha compra
[0]4/15/[19]96 mdy
[0]4-15-[19]96 mdy
[0]4.15.[19]96 mdy
[0]4/[19]96/15 myd
15/[0]4/[19]96 dmy
15/[19]96/[0]4 dym
[19]96/15/[0]4 ydm
[19]96/[0]4/15 ymd
Formato de hora
14:30
14:30[:20:997]
14:30[:20.9]
4am
4 PM

Formato alfabético

Puede especificar los datos de la fecha con un mes especificado como el nombre completo del mes. Por ejemplo, , Aprilo la abreviatura de mes de Apr, 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:

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

  • Los caracteres entre corchetes son opcionales.

  • Si especifica solo los dos últimos dígitos del año, los valores inferiores a los dos últimos dígitos del valor de la opción de configuración límite de año de dos dígitos se encuentran en el mismo siglo que el año límite. 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 límite de año de dos dígitos es 2050 (valor predeterminado), 25 se interpreta como 2025 y 50 se interpreta como 1950. Para evitar ambigüedades, use años de cuatro dígitos.

  • Si falta el día, se usará el primer día del mes.

  • La SET DATEFORMAT configuración de sesión no se aplica al especificar el mes en forma alfabética.

Alfabético
Apr[il] [15][,] 1996
Apr[il] 15[,] [19]96
Apr[il] 1996 [15]
[15] Apr[il][,] 1996
15 Apr[il][,][19]96
15 [19]96 apr[il]
[15] 1996 apr[il]
1996 APR[IL] [15]
1996 [15] APR[IL]

Formato ISO 8601

Para usar el formato ISO 8601, debe especificar cada elemento en el formato , incluidos los Tdos 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. T indica el inicio de la parte de hora del valor datetime.

La ventaja de usar el formato ISO 8601 es que es un estándar internacional con una especificación inequívoca. Además, este formato no se ve afectado por la SET DATEFORMAT configuración o SET LANGUAGE .

Ejemplos:

  • 2004-05-23T14:25:10
  • 2004-05-23T14:25:10.487
ISO 8601
yyyy-MM-ddTHH:mm:ss[.mmm]
yyyyMMdd[ HH:mm:ss[.mmm]]

Formato sin separar

Este formato es similar al formato ISO 8601, salvo que no contiene separadores de fecha.

Sin separación
yyyyMMdd HH:mm:ss[.mmm]

Formato ODBC

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 ODBC tienen el formato : { <literal_type> '<constant_value>' }

  • <literal_type> especifica el tipo de la secuencia de escape. Las marcas de tiempo tienen tres <literal_type> especificadores:

    • d = solo fecha
    • t = solo tiempo
    • 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: yyyy-MM-dd
    • t: hh:mm:ss[.fff]
    • ts: yyyy-MM-dd HH:mm:ss[.fff]
ODBC
{ ts '1998-05-02 01:23:56.123' }
{ d '1990-10-02' }
{ t '13:33:41' }

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

Los valores datetime se redondean a incrementos de .000, .003o .007 segundos, como se muestra en el ejemplo siguiente.

SELECT '01/01/2024 23:59:59.999' AS [User-specified value],
    CAST('01/01/2024 23:59:59.999' AS DATETIME) AS [System stored value]
UNION SELECT '01/01/2024 23:59:59.998', CAST('01/01/2024 23:59:59.998' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.997', CAST('01/01/2024 23:59:59.997' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.996', CAST('01/01/2024 23:59:59.996' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.995', CAST('01/01/2024 23:59:59.995' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.994', CAST('01/01/2024 23:59:59.994' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.993', CAST('01/01/2024 23:59:59.993' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.992', CAST('01/01/2024 23:59:59.992' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.991', CAST('01/01/2024 23:59:59.991' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.990', CAST('01/01/2024 23:59:59.990' AS DATETIME);

El conjunto de resultados es el siguiente:

Valor especificado por el usuario Valor almacenado por el sistema
01/01/2024 23:59:59.999 2024-01-02 00:00:00.000
01/01/2024 23:59:59.998
01/01/2024 23:59:59.997
01/01/2024 23:59:59.996
01/01/2024 23:59:59.995
2024-01-01 23:59:59.997
01/01/2024 23:59:59.994
01/01/2024 23:59:59.993
01/01/2024 23:59:59.992
2024-01-01 23:59:59.993
01/01/2024 23:59:59.991
01/01/2024 23:59:59.990
2024-01-01 23:59:59.990

Compatibilidad con ANSI e ISO 8601

datetime no es compatible con ANSI o ISO 8601.

Convierte datos de fecha y hora

Al convertir a tipos de datos de fecha y hora, el Motor de base de datos rechaza todos los valores que no puede reconocer como fechas o horas. Para obtener información sobre el uso de las CAST funciones y con datos de fecha y hora, consulte CAST y CONVERT CONVERT.

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';

El conjunto de resultados es el siguiente:

@datetime                @date
------------------------ -----------
2016-12-21 00:00:00.000  2016-12-21

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

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

Debe actualizar el ejemplo para que coincida con el formato de la región.

También puede completar el ejemplo con el formato de fecha compatible con ISO 8601 (yyyy-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 de time(n), se copia el componente de hora y el componente de fecha se establece en 1900-01-01. Cuando la precisión fraccionaria del valor time(n) es mayor que tres dígitos, el valor se trunca 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';

El conjunto de resultados es el siguiente:

@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 fracciones de segundo se establecen 0en . 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';

El conjunto de resultados es el siguiente:

@datetime                @smalldatetime
------------------------ --------------------
2016-12-01 12:32:00.000  2016-12-01 12:32:00

Cuando la conversión procede de datetimeoffset(n), se copian los componentes de fecha y hora. Se trunca la zona horaria. Cuando la precisión fraccionaria del valor datetimeoffset(n) es mayor que tres dígitos, el valor se trunca. 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';

El conjunto de resultados es el siguiente:

@datetime                @datetimeoffset
------------------------ -------------------------------
1968-10-23 12:45:37.123  1968-10-23 12:45:37.1237 +10:0

Cuando la conversión procede de datetime2(n), se copian la fecha y hora. Cuando la precisión fraccionaria del valor datetime2(n) es mayor que tres dígitos, el valor se trunca. 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';

El conjunto de resultados es el siguiente:

@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('2024-05-08 12:35:29.1234567 +12:15' AS TIME(7)) AS 'time',
    CAST('2024-05-08 12:35:29.1234567 +12:15' AS DATE) AS 'date',
    CAST('2024-05-08 12:35:29.123' AS SMALLDATETIME) AS 'smalldatetime',
    CAST('2024-05-08 12:35:29.123' AS DATETIME) AS 'datetime',
    CAST('2024-05-08 12:35:29.1234567 +12:15' AS DATETIME2(7)) AS 'datetime2',
    CAST('2024-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 2024-05-08
smalldatetime 2024-05-08 12:35:00
datetime 2024-05-08 12:35:29.123
datetime2 2024-05-08 12:35:29.1234567
datetimeoffset 2024-05-08 12:35:29.1234567 +12:15