Datos de fecha y hora de SQL Server 2008 (ADO.NET)
SQL Server 2008 incluye nuevos tipos de datos para administrar la información de fecha y hora. Los nuevos tipos de datos incluyen tipos individuales de fecha y hora y tipos de datos expandidos con mayor intervalo, precisión y conocimiento de 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. Por otra parte, solo se admiten las fechas posteriores a la introducción del calendario gregoriano en Inglaterra en 1753. Otra limitación es que estos tipos de datos anteriores no reconocen la zona horaria, por lo que resulta difícil trabajar con datos que proceden de varias zonas horarias.
La documentación completa de los tipos de datos de SQL Server está disponible en los Libros en pantalla de SQL Server. En la tabla siguiente se enumeran los temas de nivel básico específicos de la versión correspondientes a los datos de fecha y hora.
SQL Server 2000 |
SQL Server 2005 |
SQL Server 2008 |
---|---|---|
Tipos de datos de fecha y hora introducidos en SQL Server 2008
En la tabla siguiente se describen los tipos de datos de fecha y hora nuevos.
Tipo de datos de SQL Server |
Descripción |
---|---|
date |
El tipo de datos date admite las fechas en el 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 el 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, basándose en un reloj de 24 horas. El tipo de datos time admite 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 fracciones de segundo 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 único tipo de datos. Los valores predeterminados y los formatos de literal 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 2 dígitos de 00 a 14 que representa el número de horas de desfase de zona horaria. MM es una cifra de dos dígitos de 00 a 59 que representa el número de minutos adicionales en el desfase de zona horaria. Se admiten formatos de hora hasta 100 nanosegundos. El signo + o - obligatorio indica si el desfase de zona horaria se suma o resta de la hora UTC (hora universal coordinada u hora del meridiano de Greenwich) para obtener la hora local. |
Nota |
---|
Si Type System Version no se establece explícitamente en SQL Server 2008 o en Latest en la cadena de conexión, los valores de tipo datetime se procesarán utilizando el sistema de tipos de SQL Server 2005 predeterminado.Para obtener más información sobre el uso de las palabras clave Type System Version, vea Nuevas características en SQL Server 2008 (ADO.NET). |
Formato de fecha y orden de la fecha
El modo en que SQL Server analiza los valores de fecha y hora depende no solo de la versión del sistema de tipos y de la versión del servidor, sino también de los valores de idioma y formato predeterminados del servidor. Una cadena de fecha que funcione para los formatos de fecha de un idioma puede resultar irreconocible si la consulta se ejecuta mediante una conexión que utiliza un valor diferente de idioma y formato de fechas.
La instrucción SET LANGUAGE de Transact-SQL establece implícitamente el DATEFORMAT que determina el orden de los componentes de la fecha. Puede utilizar la instrucción SET DATEFORMAT de Transact-SQL en una conexión para eliminar la ambigüedad de los valores de fecha ordenando los componentes de la fecha en el orden de MDA, DMA, AMD, ADM, MAD o DAM.
Si no especifica ningún 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 un valor de idioma de inglés de Estados Unidos y como DMA (1 de febrero de 2003) en un servidor con un valor de fecha de inglés británico. El año se determina mediante la regla de año límite de SQL Server, que define la fecha límite para asignar el valor de siglo. Para obtener más información, vea two digit year cutoff (opción) en los Libros en pantalla de SQL Server.
Nota |
---|
El formato de fecha ADM no se admite al convertir de un formato de cadena en 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 en los Libros en pantalla de SQL Server 2008.
Parámetros y tipos de datos de fecha y hora
Puede especificar el tipo de datos de una clase SqlParameter mediante una de las enumeraciones SqlDbType. En SqlDbType se han agregado las siguientes enumeraciones para admitir los nuevos tipos de datos de fecha y hora.
SqlDbType.Date
SqlDbType.Time
SqlDbType.DateTime2
SqlDbType.DateTimeOffSet
Si lo desea, también puede especificar el tipo de una clase SqlParameter de forma genérica si establece la propiedad DbType de un objeto SqlParameter en un determinado valor de enumeración DbType. En DbType se han agregado los siguientes valores de enumeración 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 agregado nuevos tipos de datos System.Data.SqlTypes para admitir los nuevos tipos de datos de fecha y hora. En la siguiente tabla se describen las asignaciones entre los tipos de datos de fecha y hora de SQL Server 2008 y los tipos de datos 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 de SqlParameter pertinentes de los tipos de datos de fecha y hora.
Propiedad |
Descripción |
---|---|
Obtiene o establece si un valor acepta valores NULL. Cuando envía un valor de parámetro nulo al servidor, debe especificar DBNull en lugar de null (Nothing en Visual Basic). Para obtener más información acerca de valores nulos de base de datos, vea Tratamiento de valores NULL (ADO.NET). |
|
Obtiene o establece el número máximo de dígitos utilizados para representar el valor. Este valor se omite para los tipos de datos de fecha y hora. |
|
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, que significa que la escala real se deduce del valor y se envía al servidor. |
|
Se omite para los tipos de datos de fecha y hora. |
|
Obtiene o establece el valor del parámetro. |
|
Obtiene o establece el valor del 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 SqlCommand Parameters mediante una llamada al método Add de la colección SqlParameterCollection. El método Add acepta como entrada argumentos del constructor o cualquier objeto de parámetro ya existente.
En las secciones siguientes de este tema se proporcionan ejemplos de cómo especificar los 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 (ADO.NET) y Parámetros DataAdapter (ADO.NET).
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
El fragmento de código siguiente muestra cómo se especifica un parámetro datetime2 con los componentes 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
El fragmento de código siguiente muestra cómo se especifica un parámetro DateTimeOffSet con una fecha, una hora y un desplazamiento 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 SqlCommand, como se muestra en el fragmento de código siguiente. No obstante, el método AddWithValue no permite especificar la propiedad DbType o SqlDbType del 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 datetime, debe establecer explícitamente la propiedad SqlDbType del parámetro en el tipo de datos de la instancia. El uso de Variant o la provisión implícita de valores de parámetro puede ocasionar problemas de compatibilidad con versiones anteriores con los tipos de datos datetime y smalldatetime.
En la tabla siguiente se muestra qué SqlDbTypes se deducen de los tipos 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 |
---|---|
Recupera el valor de columna especificado como una estructura DateTime. |
|
Recupera el valor de columna especificado como una estructura DateTimeOffset. |
|
Devuelve el tipo subyacente del tipo específico de proveedor del campo. Devuelve los mismos tipos que GetFieldType en los nuevos tipos de fecha y hora. |
|
Recupera el valor de la columna especificada. Devuelve los mismos tipos que GetValue en los nuevos tipos de fecha y hora. |
|
Recupera los valores de la matriz especificada. |
|
Recupera el valor de columna como una estructura SqlString. Si los datos no se pueden expresar como una estructura SqlString, se produce una clase InvalidCastException. |
|
Recupera datos de columna como su enumeración SqlDbType predeterminada. Devuelve los mismos tipos que GetValue en los nuevos tipos de fecha y hora. |
|
Recupera los valores de la matriz especificada. |
|
Recupera los valores de columna como una cadena si Type System Version se ha establecido en SQL Server 2000 o en SQL Server 2005. Si los datos no se pueden expresar como una cadena, se produce una clase InvalidCastException. |
|
Recupera el valor de columna especificado como una estructura Timespan. |
|
Recupera el valor de columna especificado como su tipo CLR subyacente. |
|
Recupera los valores de columna de una matriz. |
|
Devuelve una clase DataTable que describe los metadatos del conjunto de resultados. |
Nota |
---|
Los nuevos SqlDbTypes de fecha y hora no se admiten en 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 los tipos de datos de fecha y hora mediante una variedad de formatos de cadena de literales distintos, que SQL Server evalúa después en tiempo de ejecución, y los convierte en estructuras de fecha y hora internas. SQL Server reconoce los datos de fecha y hora escritos entre comillas simples ('). Los ejemplos siguientes explican algunos formatos:
Formatos alfabéticos de fecha, como 'October 15, 2006'.
Formatos numéricos de fecha, como '10/15/2006'.
Formatos de cadena sin separación, como '20061015', que se interpretarían como 15 de octubre de 2006 si utiliza el formato de fecha estándar ISO.
Nota |
---|
Puede encontrar documentación completa de todos los formatos de cadena de literales y otras características de los tipos de datos de fecha y hora en los Libros en pantalla de SQL Server. |
Los valores de hora que son menores que cero o mayores o iguales que 24 horas producirán una excepción ArgumentException.
Recursos en los Libros en pantalla de SQL Server 2008
Para obtener más información sobre cómo trabajar con valores de fecha y hora en SQL Server 2008, vea los recursos siguientes en los Libros en pantalla de SQL Server 2008.
Tema |
Descripción |
---|---|
Proporciona información general sobre todos los tipos de datos y funciones de fecha y hora de Transact-SQL. |
|
Proporciona información sobre funciones y tipos de datos de fecha y hora, y ejemplos de su uso. |
|
Describe los tipos de datos de sistema de SQL Server 2008. |
Vea también
Conceptos
Asignar tipos de datos de SQL Server (ADO.NET)
Configurar parámetros y tipos de datos de parámetros (ADO.NET)