datetime2 (Transact-SQL)

Define una fecha que se combina con una hora del día basada en un reloj de 24 horas. datetime2 puede considerarse 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

Valor

Sintaxis

datetime2 [ (fractional seconds precision) ]

Uso

DECLARE @MyDatetime2 datetime2(7)

CREATE TABLE Table1 ( Column1 datetime2(7) )

Formato de literal de cadena predeterminado

(se utiliza para el cliente de nivel inferior)

AAAA-MM-DD hh:mm:ss[.fracciones de segundos]

Para obtener más información, vea la sección "Compatibilidad con versiones anteriores de los clientes de niveles inferiores" más adelante.

Intervalo de fechas

De 0001-01-01 a 9999-12-31

Del 1 de enero del año 1 después de Cristo al 31 de diciembre de 9999

Intervalo de horas

De 00:00:00 a 23:59:59.9999999

Intervalo de ajuste de zona horaria

Ninguna

Intervalos de elementos

AAAA es una cifra de cuatro dígitos comprendida entre 0001 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.

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

n* es una cifra de cero a siete dígitos comprendida entre 0 y 9999999 que representa las fracciones de segundos.

Longitud de los caracteres

19 posiciones como mínimo (AAAA-MM-DD hh:mm:ss) a 27 como máximo (AAAA-MM-DD hh:mm:ss .0000000)

Precisión, escala

De 0 a 7 dígitos, con una precisión de 100 ns. La precisión predeterminada es 7 dígitos.

Tamaño de almacenamiento

6 bytes para precisiones inferiores a 3; 7 bytes para precisiones 3 y 4. Todas las demás precisiones requieren 8 bytes.

Precisión

100 nanosegundos

Valor predeterminado

1900-01-01 00:00:00

Calendario

Gregoriano

Precisión de fracciones de segundo definida por el usuario

Conservación y reconocimiento del ajuste de zona horaria

No

Reconocimiento del horario de verano

No

Para los metadatos de tipo de datos, vea sys.systypes (Transact-SQL) o TYPEPROPERTY (Transact-SQL). La precisión y escala son variables para algunos tipos de datos de hora y fecha. Para obtener la precisión y la escala para una columna, vea COLUMNPROPERTY (Transact-SQL), COL_LENGTH (Transact-SQL)o sys.columns (Transact-SQL).

Formatos de literales de cadena admitidos para datetime2

Las tablas siguientes enumeran los formatos de literales de cadena ISO 8601 y ODBC admitidos para datetime2. Para obtener información sobre los formatos alfabético, numérico, sin separación y de hora para las partes de fecha y hora de datetime2, vea date (Transact-SQL) y hora (Transact-SQL).

ISO 8601

Descripciones

AAAA-MM-DDThh:mm:ss[. nnnnnnn]

AAAA-MM-DDThh:mm:ss[. nnnnnnn]

Este formato no se ve afectado por la configuración regional de sesión de SET LANGUAGE y SET DATEFORMAT. La letra T, los dos puntos (:) y el punto (.) se incluyen en el literal de cadena, por ejemplo '2007-05-02T19:58:47.1234567'.

ODBC

Descripción

{ ts 'aaaa-mm-dd hh:mm:ss[.fracciones de segundo]' }

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).

  • En SQL Server 2012, con el nivel de compatibilidad establecido en 10, el literal se asignará internamente al nuevo tipo time.

Compatibilidad con ANSI e ISO 8601

La compatibilidad ANSI e ISO 8601 de date y time se aplica a datetime2.

Compatibilidad con versiones anteriores de los clientes de niveles inferiores

Algunos clientes de niveles inferiores 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 SQL Server 2012

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[. nnnnnnn]

SQL_WVARCHAR o SQL_VARCHAR

DBTYPE_WSTR o DBTYPE_STR

Java.sql.String

Cadena o SqString

date

AAAA-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

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 información acerca de cómo usar las funciones CAST y CONVERT con datos de fecha y hora, vea CAST y CONVERT (Transact-SQL).

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

En la tabla siguiente se describe lo que ocurre cuando un tipo de datos datetime2 se convierte a otros tipos de datos de fecha y hora.

Tipo de datos al que se convierte

Detalles de la conversión

date

Se copian los valores de año, mes y día.

El código siguiente muestra los resultados de convertir un valor de datetime2(4) en un valor de date.

DECLARE @datetime2 datetime2(4) = '12-10-25 12:32:10.1234';
DECLARE @date date = @datetime2;
SELECT @datetime2 AS '@datetime2', @date AS 'date';
--Result
--@datetime2               date
-------------------------- ----------
--2025-12-10 12:32:10.1234 2025-12-10
--
--(1 row(s) affected)

time(n)

Los valores de hora, minuto, segundo y fracciones de segundo se copian si la escala es la misma y se redondean si la escala es diferente.

El código siguiente muestra los resultados de convertir un valor de datetime2(4) en un valor de time(3).

DECLARE @datetime2 datetime2(4) = '12-10-25 12:32:10.1237';
DECLARE @time time(3) = @datetime2;
SELECT @datetime2 AS '@datetime2', @time AS 'time(3)';
--Result
--@datetime2                time(3) 
-------------------------- ------------
--2025-12-10 12:32:10.1234 12:32:10.124
--
--(1 row(s) affected)

datetime

Se copian los valores de fecha y hora. Cuando la precisión de las fracciones del valor de datetime(n) es superior a tres dígitos, el valor se trunca.

El código siguiente muestra los resultados de convertir un valor de datetime2 en un valor de datetime.

DECLARE @datetime2 datetime2 = '12-10-25 12:32:10.1234567'
DECLARE @datetime datetime = @datetime2;
SELECT @datetime2 AS '@datetime2', @datetime AS '@datetime';
--Result
--@datetime2                  @datetime
----------------------------- -----------------------
@datetime2             @datetime
---------------------- -----------------------
2025-12-10 12:32:10.12 2025-12-10 12:32:10.123
--
--(1 row(s) affected)

smalldatetime

Se copian la fecha y las horas. Los minutos se redondean con respecto a los segundos y los segundos se establecen en 0.

El código siguiente muestra los resultados de convertir un valor de datetime2 en un valor de smalldatetime.

DECLARE @datetime2 datetime2 = '12-10-25 12:32:30.9234567';
DECLARE @smalldatetime smalldatetime = @datetime2;
SELECT @datetime2 AS '@datetime2', @smalldatetime AS '@smalldatetime';
--Result
@datetime2             @smalldatetime
---------------------- -----------------------
2025-12-10 12:32:30.92 2025-12-10 12:33:00
(1 row(s) affected)

datetimeoffset(n)

El valor de datetime2(n) se copia en el valor de datetimeoffset(n). El ajuste de zona horaria se establece en +00:0. Cuando la precisión del valor de datetime2(n) es mayor que la precisión del valor de datetimeoffset(n), el valor se redondea para ajustarse.

El código siguiente muestra los resultados de convertir un valor de datetime2(5) en un valor de datetimeoffset(3).

D DECLARE @datetime2 datetime2(3) = '12-10-25 12:32:10.12999';
DECLARE @datetimeoffset datetimeoffset(2) = @datetime2;
SELECT @datetime2 AS '@datetime2', @datetimeoffset AS '@datetimeoffset(2)';
--Result
--@datetime2              @datetimeoffset(2)
------------------------- -----------------------------
2025-12-10 12:32:10.13           2025-12-10 12:32:10.13 +00:00
--
--(1 row(s) affected)

Convertir 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 explícitas que no especifican un estilo (desde tipos de fecha y hora hasta literales de cadena) estarán en el formato predeterminado de la sesión actual. En la tabla siguiente se muestran las reglas para convertir un literal de cadena al tipo de datos datetime2.

Literal de cadena de entrada

datetime2(n)

DATE de ODBC

Los literales de cadena de ODBC se asignan al tipo de datos datetime. Cualquier operación de asignación de los literales de DATETIME de ODBC a tipos datetime2 provocará una conversión implícita entre datetime y este tipo, tal y como se define en las reglas de conversión.

TIME de ODBC

Vea la regla anterior de DATE de ODBC.

DATETIME de ODBC

Vea la regla anterior de DATE de ODBC.

Solo DATE

La parte de TIME tiene como valor predeterminado 00:00:00.

Solo TIME

La parte de DATE tiene como valor predeterminado 1900-1-1.

Solo TIMEZONE

Se proporcionan los valores predeterminados.

DATE + TIME

Trivial

DATE + TIMEZONE

No permitido.

TIME + TIMEZONE

La parte de DATE tiene como valor predeterminado 1900-1-1. Se omite la entrada de TIMEZONE.

DATE + TIME + TIMEZONE

Se usará DATETIME local.

Ejemplos

En el ejemplo siguiente se comparan los resultados de convertir una cadena a los tipos 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

Salida

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

Vea también

Referencia

CAST y CONVERT (Transact-SQL)