Datos de fecha y hora

SQL Server 2008 introduce nuevos tipos de datos para administrar la información de fecha y hora. Los nuevos tipos de datos incluyen tipos independientes para la fecha y la hora y tipos de datos expandidos con mayor control sobre el intervalo, la precisión y la zona horaria. A partir de .NET Framework versión 3.5 Service Pack (SP) 1, el proveedor de datos .NET Framework para SQL Server (System.Data.SqlClient) proporciona compatibilidad total con todas las características nuevas del Motor de base de datos de SQL Server 2008. Debe instalar .NET Framework 3.5 SP1 (o posterior) para usar estas características nuevas con SqlClient.

Las versiones de SQL Server anteriores a SQL Server 2008 solo tenían dos tipos de datos para trabajar con valores de fecha y hora: datetime y smalldatetime. Ambos tipos de datos contienen el valor de fecha y el valor de hora, lo que dificulta trabajar solo con valores de fecha o de hora. Además, estos tipos de datos solo admiten las fechas posteriores a la introducción del calendario gregoriano en Inglaterra en 1753. Otra limitación es que estos tipos de datos más antiguos no reconocen la zona horaria, por lo que resulta difícil trabajar con datos que proceden de varias zonas horarias.

Para obtener más información acerca de los tipos de fecha y hora en SQL Server, vea Tipos de datos y funciones de fecha y hora (Transact-SQL).

Tipos de datos de fecha y hora introducidos en SQL Server 2008

En la tabla siguiente se describen los nuevos tipos de datos de fecha y hora.

Tipo de datos de SQL Server Descripción
date El tipo de datos date tiene un intervalo del 1 de enero de 01 al 31 de diciembre de 9999, con una precisión de 1 día. El valor predeterminado es 1 de enero de 1900. El tamaño de almacenamiento es de 3 bytes.
time El tipo de datos time solo almacena valores de hora basados en un reloj de 24 horas. El tipo de datos time tiene un intervalo de 00:00:00,0000000 a 23:59:59,9999999 con una precisión de 100 nanosegundos. El valor predeterminado es 00:00:00,0000000 (medianoche). El tipo de datos time admite la precisión decimal de segundos definida por el usuario y su tamaño de almacenamiento varía entre 3 y 6 bytes en función de la precisión especificada.
datetime2 El tipo de datos datetime2 combina el intervalo y la precisión de los tipos de datos date y time en un solo tipo de datos.

Los valores predeterminados y los formatos de literales de cadena son los mismos que los definidos en los tipos de datos date y time.
datetimeoffset El tipo de datos datetimeoffset incluye todas las características de datetime2 con un desfase de zona horaria adicional. El desplazamiento de zona horaria se representa como [+ | -] HH:MM. HH es una cifra de dos dígitos que va de 00 a 14 y que representa el número de horas del desfase de zona horaria. MM es una cifra de dos dígitos que va de 00 a 59 y que representa el número minutos adicionales del desfase de zona horaria. Se admiten formatos de hora de hasta 100 nanosegundos. El signo + o- obligatorio indica si el ajuste de zona horaria se suma o se resta de la hora UTC (hora universal coordinada u hora del meridiano de Greenwich) para obtener la hora local.

Nota

Para obtener más información sobre el empleo de la palabra clave Type System Version, vea ConnectionString.

Formato de fecha y orden de la fecha

La forma en que SQL Server analiza los valores de fecha y hora no solo depende de la versión del sistema de tipos y de la versión del servidor, sino también de la configuración de formato y idioma predeterminados del servidor. Una cadena de fecha que funcione para los formatos de fecha de un idioma podría ser irreconocible si la consulta se ejecuta por una conexión que utiliza una configuración de formato de fecha y idioma diferente.

La instrucción SET LANGUAGE de Transact-SQL establece implícitamente DATEFORMAT, que determina el orden de las partes de la fecha. Puede usar la instrucción SET DATEFORMAT de Transact-SQL en una conexión para eliminar la ambigüedad de los valores de fecha ordenando las partes de fecha según MDA, DMA, AMD, ADM, MAD o DAM.

Si no especifica ningún valor DATEFORMAT para la conexión, SQL Server utiliza el idioma predeterminado asociado a la conexión. Por ejemplo, una cadena de fecha de "01/02/03" se interpretaría como MDA (2 de enero de 2003) en un servidor con una configuración de idioma de inglés de Estados Unidos y como DMA (1 de febrero de 2003) en un servidor con una configuración de idioma de inglés británico. El año se determina mediante el uso de la regla del año límite de SQL Server, que define la fecha límite para asignar el valor del siglo. Para obtener más información, vea la opción two year cutoff.

Nota

No se admite el formato de fecha ADM al convertir de un formato de cadena a date, time, datetime2 o datetimeoffset.

Para obtener más información sobre cómo SQL Server interpreta los datos de fecha y hora, vea el tema Usar datos de fecha y hora.

Tipos de datos de fecha y hora y parámetros

Se han agregado los siguientes valores de enumeración a SqlDbType para admitir los nuevos tipos de datos de fecha y hora.

  • SqlDbType.Date

  • SqlDbType.Time

  • SqlDbType.DateTime2

  • SqlDbType.DateTimeOffSet

Puede especificar el tipo de datos de SqlParameter mediante una de las enumeraciones SqlDbType anteriores.

Nota

No puede establecer la propiedad DbType de un SqlParameter en SqlDbType.Date.

También puede especificar el tipo de SqlParameter de forma genérica si establece la propiedad DbType de un objeto SqlParameter en un determinado valor de enumeración DbType. Se han agregado los siguientes valores de enumeración a DbType para admitir los tipos de datos datetime2 y datetimeoffset:

  • DbType.DateTime2

  • DbType.DateTimeOffset

Estas nuevas enumeraciones complementan las enumeraciones Date, Time y DateTime, que ya existían en versiones anteriores de .NET Framework.

El tipo del proveedor de datos .NET Framework de un objeto de parámetro se deduce a partir del tipo de .NET Framework del valor del objeto de parámetro o a partir de la enumeración DbType del objeto de parámetro. No se han introducido nuevos tipos de datos de System.Data.SqlTypes para admitir los nuevos tipos de datos de fecha y hora. En la tabla siguiente se describen las asignaciones entre los tipos de datos de fecha y hora de SQL Server 2008 y los tipos de datos de CLR.

Tipo de datos de SQL Server Tipo de .NET Framework System.Data.SqlDbType System.Data.DbType
date System.DateTime Date Date
time System.TimeSpan Time Time
datetime2 System.DateTime DateTime2 DateTime2
datetimeoffset System.DateTimeOffset DateTimeOffset DateTimeOffset
datetime System.DateTime DateTime DateTime
smalldatetime System.DateTime DateTime DateTime

Propiedades de SqlParameter

En la tabla siguiente se describen las propiedades SqlParameter que son pertinentes para los tipos de datos de fecha y hora.

Propiedad Descripción
IsNullable Obtiene o establece si un valor admite valores NULL. Cuando se envía un valor de parámetro nulo al servidor, se debe especificar DBNull, en lugar de null (Nothing en Visual Basic). Para obtener más información sobre valores nulos de base de datos, consulte Handling Null Values.
Precision Obtiene o establece el número máximo de dígitos usado para representar el valor. Este valor se omite para los tipos de datos de fecha y hora.
Scale Obtiene o establece el número de posiciones decimales determinado para la parte de hora del valor de Time, DateTime2 y DateTimeOffset. El valor predeterminado es 0, lo que significa que la escala real se deduce del valor y se envía al servidor.
Size Se ignora para los tipos de datos de fecha y hora.
Value Obtiene o establece el valor de parámetro.
SqlValue Obtiene o establece el valor de parámetro.

Nota

Los valores de hora que son menores que cero o mayores o iguales que 24 horas producirán una excepción ArgumentException.

Crear parámetros

Para crear un objeto SqlParameter, se puede usar su constructor o bien se puede agregar a una colección SqlCommandParameters mediante una llamada al método Add de la colección SqlParameterCollection. El método Add tomará como entrada los argumentos del constructor o un objeto de parámetro existente.

En las secciones siguientes de este tema se proporcionan ejemplos de cómo especificar parámetros de fecha y hora. Para obtener ejemplos adicionales de cómo trabajar con parámetros, vea Configurar parámetros y tipos de datos de parámetros y parámetros dataAdapter.

Ejemplo de date

El fragmento de código siguiente muestra cómo se especifica un parámetro date.

SqlParameter parameter = new SqlParameter();  
parameter.ParameterName = "@Date";  
parameter.SqlDbType = SqlDbType.Date;  
parameter.Value = "2007/12/1";  
Dim parameter As New SqlParameter()  
parameter.ParameterName = "@Date"  
parameter.SqlDbType = SqlDbType.Date  
parameter.Value = "2007/12/1"  

Ejemplo de time

El fragmento de código siguiente muestra cómo se especifica un parámetro time.

SqlParameter parameter = new SqlParameter();  
parameter.ParameterName = "@time";  
parameter.SqlDbType = SqlDbType.Time;  
parameter.Value = DateTime.Parse("23:59:59").TimeOfDay;  
Dim parameter As New SqlParameter()  
parameter.ParameterName = "@Time"  
parameter.SqlDbType = SqlDbType.Time  
parameter.Value = DateTime.Parse("23:59:59").TimeOfDay;  

Ejemplo de datetime2

En el fragmento de código siguiente se muestra cómo especificar un parámetro datetime2 con las partes de fecha y hora.

SqlParameter parameter = new SqlParameter();  
parameter.ParameterName = "@Datetime2";  
parameter.SqlDbType = SqlDbType.DateTime2;  
parameter.Value = DateTime.Parse("1666-09-02 1:00:00");  
Dim parameter As New SqlParameter()  
parameter.ParameterName = "@Datetime2"  
parameter.SqlDbType = SqlDbType.DateTime2  
parameter.Value = DateTime.Parse("1666-09-02 1:00:00");  

Ejemplo de DateTimeOffSet

En el fragmento de código siguiente se muestra cómo especificar un parámetro DateTimeOffSet con una fecha, una hora y un ajuste de zona horaria de 0.

SqlParameter parameter = new SqlParameter();  
parameter.ParameterName = "@DateTimeOffSet";  
parameter.SqlDbType = SqlDbType.DateTimeOffSet;  
parameter.Value = DateTimeOffset.Parse("1666-09-02 1:00:00+0");  
Dim parameter As New SqlParameter()  
parameter.ParameterName = "@DateTimeOffSet"  
parameter.SqlDbType = SqlDbType.DateTimeOffSet  
parameter.Value = DateTimeOffset.Parse("1666-09-02 1:00:00+0");  

AddWithValue

También puede proporcionar parámetros mediante el método AddWithValue de un SqlCommand, como se muestra en el fragmento de código siguiente. Sin embargo, el método AddWithValue no permite especificar el valor DbType o SqlDbType para el parámetro.

command.Parameters.AddWithValue(
    "@date", DateTimeOffset.Parse("16660902"));  
command.Parameters.AddWithValue( _  
    "@date", DateTimeOffset.Parse("16660902"))  

El parámetro @date podría asignarse a un tipo de datos date, datetime o datetime2 en el servidor. Al trabajar con los nuevos tipos de datos de datetime, debe establecer explícitamente la propiedad SqlDbType del parámetro en el tipo de datos de la instancia. El uso de Variant o el suministro implícito de valores de parámetros puede causar problemas de compatibilidad con versiones anteriores de los tipos de datos datetime y smalldatetime.

En la tabla siguiente se muestra qué valores SqlDbTypes se deducen a partir de los tipos de CLR:

Tipo CLR SqlDbType deducido
DateTime SqlDbType.DateTime
TimeSpan SqlDbType.Time
DateTimeOffset SqlDbType.DateTimeOffset

Recuperar datos de fecha y hora

En la tabla siguiente se describen los métodos que se usan para recuperar valores de fecha y hora de SQL Server 2008.

Método SqlClient Descripción
GetDateTime Recupera el valor de columna especificado como una estructura DateTime.
GetDateTimeOffset Recupera el valor de columna especificado como una estructura DateTimeOffset.
GetProviderSpecificFieldType Devuelve el tipo específico del proveedor subyacente para el campo. Devuelve los mismos tipos que GetFieldType para los nuevos tipos de fecha y hora.
GetProviderSpecificValue Recupera el valor de la columna especificada. Devuelve los mismos tipos que GetValue para los nuevos tipos de fecha y hora.
GetProviderSpecificValues Recupera los valores de la matriz especificada.
GetSqlString Recupera el valor de la columna como SqlString. Se produce InvalidCastException si los datos no se pueden expresar como SqlString.
GetSqlValue Recupera los datos de la columna como su SqlDbType predeterminada. Devuelve los mismos tipos que GetValue para los nuevos tipos de fecha y hora.
GetSqlValues Recupera los valores de la matriz especificada.
GetString Recupera el valor de columna como una cadena si Type System Version se ha establecido en SQL Server 2005. Se produce InvalidCastException si los datos no se pueden expresar como una cadena.
GetTimeSpan Recupera el valor de columna especificado como una estructura TimeSpan.
GetValue Recupera el valor de columna especificado como su tipo CLR subyacente.
GetValues Recupera los valores de columna de una matriz.
GetSchemaTable Devuelve un valor DataTable que describe los metadatos del conjunto de resultados.

Nota

Los nuevos SqlDbTypes de fecha y hora no se admiten para el código que se ejecuta en proceso en SQL Server. Se producirá una excepción si se pasa uno de estos tipos al servidor.

Especificar valores de fecha y hora como literales

Puede especificar tipos de datos de fecha y hora mediante una variedad de diferentes formatos de cadena literales, que SQL Server evalúa luego en el entorno de ejecución, convirtiéndolos en estructuras de fecha y hora internas. SQL Server reconoce los datos de fecha y hora que se incluyen entre comillas simples ('). Los ejemplos siguientes demuestran algunos formatos:

  • Formatos de fecha alfabéticos, como 'October 15, 2006'.

  • Formatos de fecha numéricos, como '10/15/2006'.

  • Formatos de cadena no separados, como '20061015', que se interpretarán como 15 de octubre de 2006 si usa el formato de fecha estándar ISO.

Los valores de hora que son menores que cero o mayores o iguales que 24 horas producirán una excepción ArgumentException.

recursos documentales de SQL Server

Para obtener más información sobre cómo trabajar con valores de fecha y hora en SQL Server, vea los artículos siguientes.

Artículo Descripción
Tipos de datos y funciones de fecha y hora (Transact-SQL) Proporciona información general sobre todos los tipos de datos y funciones de fecha y hora de Transact-SQL.
Uso de datos de fecha y hora Proporciona información sobre las funciones y los tipos de datos de fecha y hora, además de ejemplos de uso.
Tipos de datos (Transact-SQL) Describe los tipos de datos de sistema de SQL Server.

Consulte también