datetime2 (Transact-SQL)

 

ESTE TEMA SE APLICA A: síSQL Server (a partir de 2008)síBase de datos SQL de AzuresíAlmacenamiento de datos SQL de Azure síAlmacenamiento de datos paralelos

Define una fecha que se combina con una hora del día basada en un reloj de 24 horas. datetime2 puede considerarse como una extensión de las existentes datetime tipo que tiene un intervalo de fechas mayor, una mayor precisión de fracciones predeterminada y precisión opcional especificada por el usuario.

PropiedadValue
Sintaxisdatetime2 [(precisión de fracciones de segundo)]
UsoDECLARAR @MyDatetime2 datetime2(7)

Crear tabla Table1 (Column1 datetime2(7) )
Formato de literal de cadena predeterminado

(se usa 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 clientes de nivel inferior" que sigue.
Intervalo de fechasDe 0001-01-01 a 31.12.99

Enero 1,1 CE hasta el 31 de diciembre de 9999 CE
Intervalo de horasDe 00:00:00 a 23:59:59.9999999
Intervalo de ajuste de zona horariaNinguno
Intervalos de elementosAAAA es un número de cuatro dígitos comprendido entre 0001 y 9999 que representa un año.

MM es un número de dos dígitos comprendido entre 01 y 12, que representa un mes del año especificado.

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

HH es un número de dos dígitos, comprendida entre 00 y 23, que representa la hora.

mm es un número de dos dígitos comprendidos entre 00 y 59, que representa el minuto.

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

n * es un número cero a siete dígitos comprendido entre 0 y 9999999 que representa las fracciones de segundo. En informática, las fracciones de segundo se truncan cuando n > 3.
Longitud en caracteres19 posiciones como mínimo (AAAA-MM-DD hh:mm:ss) a 27 como máximo (AAAA-MM-DD hh:mm:ss .0000000)
Precisión, escalaDe 0 a 7 dígitos, con una precisión de 100 ns. La precisión predeterminada es 7 dígitos.
Tamaño de almacenamiento6 bytes para precisiones inferiores a 3; 7 bytes para precisiones 3 y 4. Todas las demás precisiones requieren 8 bytes.
Precisión100 nanosegundos
Valor predeterminado1900-01-01 00:00:00
CalendarioGregoriano
Precisión de fracciones de segundo definida por el usuario
Conservación y reconocimiento del ajuste de zona horariaNo
Reconocimiento del horario de veranoNo

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 escala de una columna, vea COLUMNPROPERTY (Transact-SQL), COL_LENGTH (Transact-SQL), o sys.columns (Transact-SQL).

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

ISO 8601Descripciones
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. El T, los dos puntos (:) y el punto (.) se incluyen en el literal de cadena, por ejemplo '&2007;-05-02T19:58:47.1234567'.
ODBCDescription
{ 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).

La compatibilidad ANSI e ISO 8601 de fecha y tiempo se aplican a datetime2.

Algunos clientes de nivel inferior no admiten la tiempo, fecha, datetime2 y datetimeoffset tipos de datos. 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.

SQL Servertipo de datosEl formato del literal de cadena predeterminado se pasó al cliente de nivel inferiorODBC de nivel inferiorOLEDB de nivel inferiorJDBC de nivel inferiorSQLCLIENT de nivel inferior
tiempohh:mm:ss[.nnnnnnn]SQL_WVARCHAR o SQL_VARCHARDBTYPE_WSTR o DBTYPE_STRJava.sql.StringCadena o SqString
fechaYYYY-MM-DDSQL_WVARCHAR o SQL_VARCHARDBTYPE_WSTR o DBTYPE_STRJava.sql.StringCadena o SqString
datetime2AAAA-MM-DD hh:mm:ss[.nnnnnnn]SQL_WVARCHAR o SQL_VARCHARDBTYPE_WSTR o DBTYPE_STRJava.sql.StringCadena o SqString
DateTimeOffsetAAAA-MM-DD hh [.nnnnnnn] [+-] hh: mmSQL_WVARCHAR o SQL_VARCHARDBTYPE_WSTR o DBTYPE_STRJava.sql.StringCadena o SqString

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 utilizar las funciones CAST y CONVERT con datos de fecha y hora, vea CAST y CONVERT (Transact-SQL)

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

Esta sección describe lo que ocurre cuando los otros tipos de datos de fecha y hora se convierten a la datetime2 tipo de datos.

Cuando la conversión es de fecha, se copian el 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 date = '12-21-16';
DECLARE @datetime2 datetime2 = @date;

SELECT @datetime2 AS '@datetime2', @date AS '@date';
  
--Result  
--@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 siguiente ejemplo se muestran los resultados de convertir un valor time(7) en un valor datetime2.

DECLARE @time time(7) = '12:10:16.1234567';
DECLARE @datetime2 datetime2 = @time;

SELECT @datetime2 AS '@datetime2', @time AS '@time';
  
--Result  
--@datetime2                  @time
----------------------------- ----------------
--1900-01-01 12:10:16.1234567 12:10:16.1234567

Cuando la conversión es de smalldatetime, se copian las horas y 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 smalldatetime = '12-01-16 12:32';
DECLARE @datetime2 datetime2 = @smalldatetime;

SELECT @datetime2 AS '@datetime2', @smalldatetime AS '@smalldatetime'; 
  
--Result  
--@datetime2                  @smalldatetime
----------------------------- -----------------------
--2016-12-01 12:32:00.0000000 2016-12-01 12:32:00 

Cuando la conversión es de 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 datetimeoffset(7) = '2016-10-23 12:45:37.1234567 +10:0';
DECLARE @datetime2 datetime2 = @datetimeoffset;

SELECT @datetime2 AS '@datetime2', @datetimeoffset AS '@datetimeoffset'; 
  
--Result  
--@datetime2                  @datetimeoffset
----------------------------- ----------------------------------
--2016-10-23 12:45:37.1234567 2016-10-23 12:45:37.1234567 +10:00

Cuando la conversión es de datetime, se copian a la fecha y hora. La precisión fraccionaria se extiende a 7 dígitos. En el siguiente ejemplo se muestran los resultados de convertir un valor datetime en un valor datetime2.

DECLARE @datetime datetime = '2016-10-23 12:45:37.333';
DECLARE @datetime2 datetime2 = @datetime;

SELECT @datetime2 AS '@datetime2', @datetime AS '@datetime';
   
--Result  
--@datetime2                  @datetime
------------------------- ---------------------------
--2016-10-23 12:45:37.3333333 2016-10-23 12:45:37.333

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. La siguiente tabla muestra las reglas para convertir una cadena literal la datetime2 tipo de datos.

Literal de cadena de entradadatetime2
DATE de ODBCLiterales de cadena ODBC se asignan a la datetime tipo de datos. Cualquier operación de asignación de literales de DATETIME de ODBC en datetime2 tipos provocará una conversión implícita entre datetime y este tipo de acuerdo con las reglas de conversión.
TIME de ODBCVea la regla anterior de DATE de ODBC.
DATETIME DE ODBCVea la regla anterior de DATE de ODBC.
Solo DATELa parte de TIME tiene como valor predeterminado 00:00:00.
Solo TIMELa parte de DATE tiene como valor predeterminado 1900-1-1.
Solo TIMEZONESe proporcionan los valores predeterminados.
DATE + TIMETrivial
DATE + TIMEZONENo permitido.
TIME + TIMEZONELa parte de DATE tiene como valor predeterminado 1900-1-1. Se omite la entrada de TIMEZONE.
DATE + TIME + TIMEZONESe usará DATETIME local.

En el ejemplo siguiente se compara los resultados de convertir una cadena a cada uno de ellos fecha y tiempo tipo de datos.

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 datosSalida
tiempo12:35:29. 1234567
fecha2007-05-08
smalldatetime2007-05-08 12:35:00
fecha y hora2007-05-08 12:35:29.123
datetime22007-05-08 12:35:29. 1234567
DateTimeOffset2007-05-08 12:35:29.1234567 +12:15

CAST y CONVERT (Transact-SQL)

Adiciones de comunidad

AGREGAR
Mostrar: