datetime2 (Transact-SQL)datetime2 (Transact-SQL)

SE APLICA A: síSQL Server (a partir de 2008) síAzure SQL Database síAzure SQL Data Warehouse síAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Define una fecha que se combina con una hora del día basada en un reloj de 24 horas.Defines a date that is combined with a time of day that is based on 24-hour clock. 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.datetime2 can be considered as an extension of the existing datetime type that has a larger date range, a larger default fractional precision, and optional user-specified precision.

Descripción de datetime2datetime2 description

PropiedadProperty ValorValue
SintaxisSyntax datetime2 [(precisión de fracciones de segundo)]datetime2 [ (fractional seconds precision) ]
UsoUsage DECLARE @MyDatetime2 datetime2(7)DECLARE @MyDatetime2 datetime2(7)

CREATE TABLE Table1 ( Column1 datetime2(7) )CREATE TABLE Table1 ( Column1 datetime2(7) )
Formato de literal de cadena predeterminadoDefault string literal format

(se usa para el cliente de nivel inferior)(used for down-level client)
AAAA-MM-DD hh:mm:ss[.fracciones de segundos]YYYY-MM-DD hh:mm:ss[.fractional seconds]

Para más información, vea la sección "Compatibilidad con versiones anteriores de clientes de niveles inferiores" más adelante.For more information, see the "Backward Compatibility for Down-level Clients" section that follows.
Intervalo de fechasDate range De 0001-01-01 a 31.12.990001-01-01 through 9999-12-31

Del 1 de enero del año 1 después de Cristo al 31 de diciembre de 9999January 1,1 CE through December 31, 9999 CE
Intervalo de horasTime range De 00:00:00 a 23:59:59.999999900:00:00 through 23:59:59.9999999
Intervalo de ajuste de zona horariaTime zone offset range NoneNone
Intervalos de elementosElement ranges AAAA es una cifra de cuatro dígitos comprendida entre 0001 y 9999 que representa un año.YYYY is a four-digit number, ranging from 0001 through 9999, that represents a year.

MM es una cifra de dos dígitos comprendida entre 01 y 12 que representa un mes del año especificado.MM is a two-digit number, ranging from 01 to 12, that represents a month in the specified year.

DD es una cifra de dos dígitos comprendida entre 01 y 31 (dependiendo del mes) que representa un día del mes especificado.DD is a two-digit number, ranging from 01 to 31 depending on the month, that represents a day of the specified month.

hh es una cifra de dos dígitos comprendida entre 00 y 23 que representa la hora.hh is a two-digit number, ranging from 00 to 23, that represents the hour.

mm es una cifra de dos dígitos comprendida entre 00 y 59 que representa los minutos.mm is a two-digit number, ranging from 00 to 59, that represents the minute.

ss es una cifra de dos dígitos comprendida entre 00 y 59 que representa los segundos.ss is a two-digit number, ranging from 00 to 59, that represents the second.

n* es una cifra de cero a siete dígitos comprendida entre 0 y 9999999 que representa las fracciones de segundos.n* is a zero- to seven-digit number from 0 to 9999999 that represents the fractional seconds. En informática, las fracciones de segundo se truncarán cuando n > 3.In Informatica, the fractional seconds will be truncated when n > 3.
Longitud en caracteresCharacter length 19 posiciones como mínimo (AAAA-MM-DD hh:mm:ss) a 27 como máximo (AAAA-MM-DD hh:mm:ss .0000000)19 positions minimum (YYYY-MM-DD hh:mm:ss ) to 27 maximum (YYYY-MM-DD hh:mm:ss.0000000)
Precisión, escalaPrecision, scale De 0 a 7 dígitos, con una precisión de 100 ns.0 to 7 digits, with an accuracy of 100ns. La precisión predeterminada es 7 dígitos.The default precision is 7 digits.
Tamaño de almacenamientoStorage size 6 bytes para una precisión inferior a 3.6 bytes for precision less than 3.
7 bytes para las precisiones 3 y 4.7 bytes for precision 3 or 4.
Todas las demás precisiones requieren 8 bytes.1All other precision require 8 bytes.1
PrecisiónAccuracy 100 nanosegundos100 nanoseconds
Valor predeterminadoDefault value 1900-01-01 00:00:001900-01-01 00:00:00
CalendarioCalendar GregorianoGregorian
Precisión de fracciones de segundo definida por el usuarioUser-defined fractional second precision Yes
Conservación y reconocimiento del ajuste de zona horariaTime zone offset aware and preservation NoNo
Reconocimiento del horario de veranoDaylight saving aware NoNo

1 El primer byte de un valor datetime2 almacena la precisión del valor, lo que significa que el almacenamiento real necesario para un valor datetime2 es el tamaño de almacenamiento que se indica en la tabla anterior, más 1 byte extra para almacenar la precisión.1 The first byte of a datetime2 value stores the precision of the value, which means the actual storage required for a datetime2 value is the storage size indicated in the table above plus 1 additional byte to store the precision. Esto hace que el tamaño máximo de un valor datetime2 sea de 9 bytes: 1 byte de precisión, más 8 bytes de almacenamiento de datos a la precisión máxima.This makes the maximum size of a datetime2 value 9 bytes - 1 byte stores precision plus 8 bytes for data storage at maximum precision.

Para más información sobre los metadatos de tipo de datos, vea sys.systypes (Transact-SQL) o TYPEPROPERTY (Transact-SQL).For data type metadata, see sys.systypes (Transact-SQL) or TYPEPROPERTY (Transact-SQL). La precisión y escala son variables para algunos tipos de datos de hora y fecha.Precision and scale are variable for some date and time data types. Para conocer la precisión y la escala de una columna, vea COLUMNPROPERTY (Transact-SQL), COL_LENGTH (Transact-SQL) o sys.columns (Transact-SQL).To obtain the precision and scale for a column, see COLUMNPROPERTY (Transact-SQL), COL_LENGTH (Transact-SQL), or sys.columns (Transact-SQL).

Formatos de literales de cadena admitidos para datetime2Supported string literal formats for datetime2

En las siguientes tablas se enumeran los formatos de literales de cadena ISO 8601 y ODBC admitidos para datetime2.The following tables list the supported ISO 8601 and ODBC string literal formats for datetime2. Para más información sobre los formatos alfabético, numérico, sin separación y de hora de las partes de fecha y hora de datetime2, vea date (Transact-SQL) y time (Transact-SQL).For information about alphabetical, numeric, unseparated, and time formats for the date and time parts of datetime2, see date (Transact-SQL) and time (Transact-SQL).

ISO 8601ISO 8601 DescripcionesDescriptions
AAAA-MM-DDThh:mm:ss[.nnnnnnn]YYYY-MM-DDThh:mm:ss[.nnnnnnn]

AAAA-MM-DDThh:mm:ss[.nnnnnnn]YYYY-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.This format is not affected by the SET LANGUAGE and SET DATEFORMAT session locale settings. La letra T, los dos puntos (:) y el punto (.) se incluyen en el literal de cadena, por ejemplo, "2007-05-02T19:58:47.1234567".The T, the colons (:) and the period (.) are included in the string literal, for example '2007-05-02T19:58:47.1234567'.
ODBCODBC DescripciónDescription
{ ts 'aaaa-mm-dd hh:mm:ss[.fracciones de segundo]' }{ ts 'yyyy-mm-dd hh:mm:ss[.fractional seconds]' } Específico de ODBC API:ODBC API specific:

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).The number of digits to the right of the decimal point, which represents the fractional seconds, can be specified from 0 up to 7 (100 nanoseconds).

Compatibilidad con ANSI e ISO 8601ANSI and ISO 8601 compliance

La compatibilidad ANSI e ISO 8601 de date y time es válida también para datetime2.The ANSI and ISO 8601 compliance of date and time apply to datetime2.

Compatibilidad con versiones anteriores de los clientes de niveles inferioresBackward Compatibility for Down-level Clients

Algunos clientes de nivel inferior no admiten los tipos de datos time, date, datetime2 y datetimeoffset.Some down-level clients do not support the time, date, datetime2 and datetimeoffset data types. En la tabla siguiente se muestra la asignación de tipo entre una instancia de nivel superior de SQL ServerSQL Server y los clientes de nivel inferior.The following table shows the type mapping between an up-level instance of SQL ServerSQL Server and down-level clients.

Tipo de datos de SQL ServerSQL ServerSQL ServerSQL Server data type El formato del literal de cadena predeterminado se pasó al cliente de nivel inferiorDefault string literal format passed to down-level client ODBC de nivel inferiorDown-level ODBC OLEDB de nivel inferiorDown-level OLEDB JDBC de nivel inferiorDown-level JDBC SQLCLIENT de nivel inferiorDown-level SQLCLIENT
timetime hh:mm:ss[.nnnnnnn]hh:mm:ss[.nnnnnnn] SQL_WVARCHAR o SQL_VARCHARSQL_WVARCHAR or SQL_VARCHAR DBTYPE_WSTR o DBTYPE_STRDBTYPE_WSTRor DBTYPE_STR Java.sql.StringJava.sql.String Cadena o SqStringString or SqString
datedate YYYY-MM-DDYYYY-MM-DD SQL_WVARCHAR o SQL_VARCHARSQL_WVARCHAR or SQL_VARCHAR DBTYPE_WSTR o DBTYPE_STRDBTYPE_WSTRor DBTYPE_STR Java.sql.StringJava.sql.String Cadena o SqStringString or SqString
datetime2datetime2 AAAA-MM-DD hh:mm:ss[.nnnnnnn]YYYY-MM-DD hh:mm:ss[.nnnnnnn] SQL_WVARCHAR o SQL_VARCHARSQL_WVARCHAR or SQL_VARCHAR DBTYPE_WSTR o DBTYPE_STRDBTYPE_WSTRor DBTYPE_STR Java.sql.StringJava.sql.String Cadena o SqStringString or SqString
datetimeoffsetdatetimeoffset YYYY-MM-DD hh:mm:ss[.nnnnnnn] [+|-]hh:mmYYYY-MM-DD hh:mm:ss[.nnnnnnn] [+|-]hh:mm SQL_WVARCHAR o SQL_VARCHARSQL_WVARCHAR or SQL_VARCHAR DBTYPE_WSTR o DBTYPE_STRDBTYPE_WSTRor DBTYPE_STR Java.sql.StringJava.sql.String Cadena o SqStringString or SqString

Convertir datos de fecha y horaConverting date and time data

Cuando se convierte a los tipos de datos de fecha y hora, SQL ServerSQL Server rechaza todos los valores que no reconoce como fechas u horas.When you convert to date and time data types, SQL ServerSQL Server rejects all values it cannot recognize as dates or times. Para más información sobre cómo usar las funciones CAST y CONVERT con datos de fecha y hora, vea CAST y CONVERT (Transact-SQL).For information about using the CAST and CONVERT functions with date and time data, see CAST and CONVERT (Transact-SQL)

Convertir otros tipos de fecha y hora en el tipo de datos datetime2Converting other date and time types to the datetime2 data type

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.This section describes what occurs when other date and time data types are converted to the datetime2 data type.

Cuando la conversión es desde date, se copian los valores de año, mes y día.When the conversion is from date, the year, month and day are copied. El componente de hora se establece en 00:00:00.0000000.The time component is set to 00:00:00.0000000. En el código siguiente se muestran los resultados de convertir un valor date en un valor datetime2.The following code shows the results of converting a date value to a datetime2 value.

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 desde time(n), se copia el componente de hora y el componente de fecha se establece en "1900-01-01".When the conversion is from time(n), the time component is copied, and the date component is set to '1900-01-01'. En el siguiente ejemplo se muestran los resultados de convertir un valor time(7) en un valor datetime2.The following example shows the results of converting a time(7) value to a datetime2 value.

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 desde smalldatetime, se copian las horas y los minutos.When the conversion is from smalldatetime, the hours and minutes are copied. Los segundos y las fracciones de segundo se establecen en 0.The seconds and fractional seconds are set to 0. En el código siguiente se muestran los resultados de convertir un valor smalldatetime en un valor datetime2.The following code shows the results of converting a smalldatetime value to a datetime2 value.

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 desde datetimeoffset(n), se copian los componentes de fecha y hora.When the conversion is from datetimeoffset(n), the date and time components are copied. Se trunca la zona horaria.The time zone is truncated. En el siguiente ejemplo se muestran los resultados de convertir un valor datetimeoffset(7) en un valor datetime2.The following example shows the results of converting a datetimeoffset(7) value to a datetime2 value.

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 desde datetime, se copian la fecha y la hora.When the conversion is from datetime, the date and time are copied. La precisión de las fracciones se amplía a 7 dígitos.The fractional precision is extended to 7 digits. En el siguiente ejemplo se muestran los resultados de convertir un valor datetime en un valor datetime2.The following example shows the results of converting a datetime value to a datetime2 value.

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

Nota

Por debajo del nivel de compatibilidad de base de datos 130, las conversiones implícitas de los tipos de datos datetime a datetime2 muestran una mayor precisión al reflejar las fracciones de milisegundos, lo que se traduce en diferentes valores convertidos, como se observa en el ejemplo anterior.Under database compatibility level 130, implicit conversions from datetime to datetime2 data types show improved accuracy by accounting for the fractional milliseconds, resulting in different converted values, as seen in the example above. Use una conversión explícita del tipo de datos datetime2 siempre que haya un escenario de comparación mixto entre tipos de datos datetime y datetime2.Use explicit casting to datetime2 datatype whenever a mixed comparison scenario between datetime and datetime2 datatypes exists. Para obtener más información, consulte este artículo del servicio de soporte técnico de Microsoft.For more information, refer to this Microsoft Support Article.

Convertir literales de cadena a datetime2Converting String Literals to 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.Conversions from string literals to date and time types are permitted if all parts of the strings are in valid formats. En caso contrario, se generará un error en el tiempo de ejecución.Otherwise, a runtime error is raised. 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.Implicit conversions or explicit conversions that do not specify a style, from date and time types to string literals will be in the default format of the current session. En la siguiente tabla se muestran las reglas para convertir un literal de cadena al tipo de datos datetime2.The following table shows the rules for converting a string literal to the datetime2 data type.

Literal de cadena de entradaInput string literal datetime2(n)datetime2(n)
DATE de ODBCODBC DATE Los literales de cadena de ODBC se asignan al tipo de datos datetime.ODBC string literals are mapped to the datetime data type. 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.Any assignment operation from ODBC DATETIME literals into datetime2 types will cause an implicit conversion between datetime and this type as defined by the conversion rules.
TIME de ODBCODBC TIME Vea la regla anterior de DATE de ODBC.See previous ODBC DATE rule.
DATETIME DE ODBCODBC DATETIME Vea la regla anterior de DATE de ODBC.See previous ODBC DATE rule.
Solo DATEDATE only La parte de TIME tiene como valor predeterminado 00:00:00.The TIME part defaults to 00:00:00.
Solo TIMETIME only La parte de DATE tiene como valor predeterminado 1900-1-1.The DATE part defaults to 1900-1-1.
Solo TIMEZONETIMEZONE only Se proporcionan los valores predeterminados.Default values are supplied.
DATE + TIMEDATE + TIME TrivialTrivial
DATE + TIMEZONEDATE + TIMEZONE No permitido.Not allowed.
TIME + TIMEZONETIME + TIMEZONE La parte de DATE tiene como valor predeterminado 1900-1-1.The DATE part defaults to 1900-1-1. Se omite la entrada de TIMEZONE.TIMEZONE input is ignored.
DATE + TIME + TIMEZONEDATE + TIME + TIMEZONE Se usará DATETIME local.The local DATETIME will be used.

EjemplosExamples

En el siguiente ejemplo se comparan los resultados de convertir una cadena a cada tipo de datos date y time.The following example compares the results of casting a string to each date and time data type.

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.Here is the result set.

Tipo de datosData type SalidaOutput
timetime 12:35:29.12:35:29. 12345671234567
datedate 2007-05-082007-05-08
smalldatetimesmalldatetime 2007-05-08 12:35:002007-05-08 12:35:00
datetimedatetime 2007-05-08 12:35:29.1232007-05-08 12:35:29.123
datetime2datetime2 2007-05-08 12:35:29.2007-05-08 12:35:29. 12345671234567
datetimeoffsetdatetimeoffset 2007-05-08 12:35:29.1234567 +12:152007-05-08 12:35:29.1234567 +12:15

Vea tambiénSee also

CAST y CONVERT (Transact-SQL)CAST and CONVERT (Transact-SQL)