datetime (Transact-SQL)
Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics 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 1753 9999 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 , .003 o .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_english
es , 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_english
en , 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, , April
o 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, useN''
.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 como2025
y50
se interpreta como1950
. 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 T
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. 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 fechat
= solo tiempots
= 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
, .003
o .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);
Este es el conjunto de resultados.
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';
Este es el conjunto de resultados.
@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';
Este es el conjunto de resultados.
@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 0
en . 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';
Este es el conjunto de resultados.
@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';
Este es el conjunto de resultados.
@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';
Este es el conjunto de resultados.
@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';
Este es el conjunto de resultados.
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 |