datetime2 (Transact-SQL)
Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Punto de conexión de análisis SQL en Microsoft Fabric Almacenamiento en Microsoft Fabric
Define una fecha que se combina con una hora del día basada en un reloj de 24 horas. datetime2 se puede considerar como una extensión del tipo datetime existente que tiene un rango de fechas mayor, un valor predeterminado mayor de precisión fraccionaria y una precisión opcional especificada por el usuario.
Descripción de datetime2
Propiedad | Value |
---|---|
Sintaxis | datetime2 [(precisión de fracciones de segundo)] |
Uso | DECLARE @MyDatetime2 datetime2(7); CREATE TABLE Table1 (Column1 datetime2(7)); |
Formato de literal de cadena predeterminado (se usa para el cliente de nivel inferior) |
yyyy-MM-dd HH:mm:ss[.nnnnnnn] Para obtener más información, consulte Compatibilidad con versiones anteriores para clientes de nivel inferior más adelante en este artículo. |
Intervalo de fechas | 0001-01-01 hasta 9999-12-31 Del 1 de enero del año 1 E. C. al 31 de diciembre de 9999 E. C. |
Intervalo de horas | 00:00:00 hasta 23:59:59.9999999 |
Intervalo de ajuste de zona horaria | Ninguno |
Intervalos de elementos | yyyy es un número de cuatro dígitos, que va desde 0001 hasta 9999 , que representa un año.MM es un número de dos dígitos, que va de 01 a 12 , que representa un mes en el año especificado.dd es un número de dos dígitos, que oscila entre 01 y 31 dependiendo del mes, que representa un día del mes especificado.HH es un número de dos dígitos, que va de 00 a 23 , que representa la hora.mm es un número de dos dígitos, que va de 00 a 59 , que representa el minuto.ss es un número de dos dígitos, que va de 00 a 59 , que representa el segundo.n* es un número de cero a siete dígitos de 0 a 9999999 , que representa las fracciones de segundos. En Informatica, las fracciones de segundos se truncan cuando n es menor que 3 . |
Longitud en caracteres | 19 posiciones mínimas (yyyy-MM-dd HH:mm:ss ) a 27 como máximo (yyyy-MM-dd HH:mm:ss.0000000 ) |
Precisión, escala | De 0 a 7 dígitos, con una precisión de 100 nanosegundos (100 ns). La precisión predeterminada es 7 dígitos. En Microsoft Fabric, esta precisión puede ser un entero comprendido entre 0 y 6, sin ningún valor predeterminado. La precisión debe especificarse en Microsoft Fabric. |
Tamaño de almacenamiento1 | 6 bytes para una precisión inferior a 3. 7 bytes para las precisiones 3 y 4. El resto de precisión requiere 8 bytes. 2 |
Precisión | 100 nanosegundos |
Valor predeterminado | 1900-01-01 00:00:00 |
Calendario | Gregoriano |
Precisión de fracciones de segundo definida por el usuario | Sí |
Conservación y reconocimiento del ajuste de zona horaria | No |
Reconocimiento del horario de verano | No |
1 Los valores proporcionados son del almacén sin comprimir. El uso de compresión de datos o almacén de columnas podría modificar el tamaño de almacenamiento para cada precisión. Además, el tamaño de almacenamiento en disco y en memoria puede diferir. Por ejemplo, los valores datetime2 requieren siempre 8 bytes de memoria cuando se usa el modo por lotes.
2 Cuando se convierte un valor datetime2 en un valor varbinary , se agrega un byte adicional al valor varbinary para almacenar la precisión.
Para obtener metadatos de tipo de datos, consulte sys.systypes o TYPEPROPERTY. La precisión y escala son variables para algunos tipos de datos de hora y fecha. Para obtener la precisión y la escala de una columna, consulte COLUMNPROPERTY, COL_LENGTH o sys.columns.
Formatos de literales de cadena admitidos para datetime2
En las siguientes tablas se enumeran los formatos de literales de cadena ISO 8601 y ODBC admitidos para datetime2. Para obtener información sobre los formatos alfabéticos, numéricos, no separados y de hora para las partes de fecha y hora de datetime2, vea fecha y hora.
ISO 8601 | Descripciones |
---|---|
yyyy-MM-ddTHH:mm:ss[.nnnnnnn] |
Este formato no se ve afectado por la configuración regional de la SET LANGUAGE sesión y SET DATEFORMAT . , T los dos puntos (: ) y el punto (. ) se incluyen en el literal de cadena, por ejemplo 2024-05-02T19:58:47.1234567 . |
ODBC | Descripción |
---|---|
{ ts 'yyyy-MM-dd HH:mm:ss[.nnnnnnn]' } |
Específico de ODBC API: El número de dígitos a la derecha del separador decimal, que representa las fracciones de segundo, se puede especificar de 0 a 7 (100 nanosegundos). |
Compatibilidad con ANSI e ISO 8601
La compatibilidad ANSI e ISO 8601 de date y time es válida también para datetime2.
Compatibilidad con versiones anteriores de clientes de niveles inferiores
Algunos clientes de nivel inferior no admiten los tipos de datos time, date, datetime2 y datetimeoffset. En la tabla siguiente se muestra la asignación de tipo entre una instancia de nivel superior de SQL Server y los clientes de nivel inferior.
Tipo de datos de SQL Server | El formato del literal de cadena predeterminado se pasó al cliente de nivel inferior | ODBC de nivel inferior | OLEDB de nivel inferior | JDBC de nivel inferior | SQLCLIENT de nivel inferior |
---|---|---|---|---|---|
time | HH:mm:ss[.nnnnnnnn] | SQL_WVARCHAR o SQL_VARCHAR | DBTYPE_WSTR o DBTYPE_STR | Java.sql.String | Cadena o SqString |
date | yyyy-MM-dd | SQL_WVARCHAR o SQL_VARCHAR | DBTYPE_WSTR o DBTYPE_STR | Java.sql.String | Cadena o SqString |
datetime2 | aaaa-MM-dd HH:mm:ss[.nnnnnnn] | SQL_WVARCHAR o SQL_VARCHAR | DBTYPE_WSTR o DBTYPE_STR | Java.sql.String | Cadena o SqString |
datetimeoffset | aaaa-MM-dd HH:mm:ss[.nnnnnnn] [+|-]hh:mm | SQL_WVARCHAR o SQL_VARCHAR | DBTYPE_WSTR o DBTYPE_STR | Java.sql.String | Cadena o SqString |
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 funciones CAST y CONVERT con datos de fecha y hora, consulte CAST y CONVERT.
Convertir otros tipos de fecha y hora al tipo de datos datetime2
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 datetime2.
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.0000000. En el código siguiente se muestran los resultados de convertir un valor date
en un valor datetime2
.
DECLARE @date AS DATE = '12-21-16';
DECLARE @datetime2 AS DATETIME2 = @date;
SELECT @datetime2 AS '@datetime2',
@date AS '@date';
Este es el conjunto de resultados.
@datetime2 @date
--------------------------- ----------
2016-12-21 00:00:00.0000000 2016-12-21
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
. En el ejemplo siguiente se muestran los resultados de convertir un valor time(7) en un valor datetime2 .
DECLARE @time AS TIME (7) = '12:10:16.1234567';
DECLARE @datetime2 AS DATETIME2 = @time;
SELECT @datetime2 AS '@datetime2',
@time AS '@time';
Este es el conjunto de resultados.
@datetime2 @time
--------------------------- ----------------
1900-01-01 12:10:16.1234567 12:10:16.1234567
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 datetime2
.
DECLARE @smalldatetime AS SMALLDATETIME = '12-01-16 12:32';
DECLARE @datetime2 AS DATETIME2 = @smalldatetime;
SELECT @datetime2 AS '@datetime2',
@smalldatetime AS '@smalldatetime';
Este es el conjunto de resultados.
@datetime2 @smalldatetime
--------------------------- -----------------------
2016-12-01 12:32:00.0000000 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. En el siguiente ejemplo se muestran los resultados de convertir un valor datetimeoffset(7)
en un valor datetime2
.
DECLARE @datetimeoffset AS DATETIMEOFFSET (7) = '2016-10-23 12:45:37.1234567 +10:0';
DECLARE @datetime2 AS DATETIME2 = @datetimeoffset;
SELECT @datetime2 AS '@datetime2',
@datetimeoffset AS '@datetimeoffset';
Este es el conjunto de resultados.
@datetime2 @datetimeoffset
--------------------------- ----------------------------------
2016-10-23 12:45:37.1234567 2016-10-23 12:45:37.1234567 +10:00
Cuando la conversión es desde datetime, se copian la fecha y la hora. La precisión de las fracciones se amplía a 7 dígitos. En el siguiente ejemplo se muestran los resultados de convertir un valor datetime
en un valor datetime2
.
DECLARE @datetime AS DATETIME = '2016-10-23 12:45:37.333';
DECLARE @datetime2 AS DATETIME2 = @datetime;
SELECT @datetime2 AS '@datetime2',
@datetime AS '@datetime';
Este es el conjunto de resultados.
@datetime2 @datetime
----------------------- ---------------------------
2016-10-23 12:45:37.3333333 2016-10-23 12:45:37.333
Conversión explícita a datetime2 al usar datetime
En el nivel de compatibilidad de la base de datos 130 y posteriores, las conversiones implícitas de tipos de datos datetime a datetime2 muestran una precisión mejorada teniendo en cuenta los milisegundos fraccionarios, lo que da lugar a valores convertidos diferentes, como se muestra en el ejemplo anterior. Use la conversión explícita al tipo de datos datetime2 siempre que exista un escenario de comparación mixto entre los tipos de datos datetime y datetime2 . Para más información, consulte Mejoras de SQL Server y Azure SQL Database para controlar algunos tipos de datos y operaciones poco frecuentes.
Conversión de literales de cadena a datetime2
Las conversiones de literales de cadena en tipos de fecha y hora son posibles cuando todas las partes de las cadenas están en formatos válidos. En caso contrario, se generará un error en el tiempo de ejecución. Las conversiones implícitas o las conversiones explícitas que no especifican un estilo, de tipos de fecha y hora a literales de cadena están en el formato predeterminado de la sesión actual. En la siguiente tabla se muestran las reglas para convertir un literal de cadena al tipo de datos datetime2.
Literal de cadena de entrada | datetime2(n) |
---|---|
ODBC DATE |
Los literales de cadena de ODBC se asignan al tipo de datos datetime. Cualquier operación de asignación de ODBC DATETIME literales en tipos datetime2 provoca una conversión implícita entre datetime y este tipo, tal como se define en las reglas de conversión. |
ODBC TIME |
Consulte la regla anterior ODBC DATE . |
ODBC DATETIME |
Consulte la regla anterior ODBC DATE . |
Solo DATE |
El valor predeterminado de la TIME parte es 00:00:00 . |
Solo TIME |
El valor predeterminado de la DATE parte es 1900-01-01 . |
Solo TIMEZONE |
Se proporcionan los valores predeterminados. |
DATE + TIME |
Trivial. |
DATE + TIMEZONE |
No permitido. |
TIME + TIMEZONE |
La DATE parte tiene como valor predeterminado 1900-1-1. TIMEZONE se omite la entrada. |
DATE + TIME + TIMEZONE |
Se usa la configuración local DATETIME . |
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';
Este es el conjunto de resultados.
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 |