Datos de fecha y hora
SQL Server 2008 ha incorporado nuevos tipos de datos para administrar la información sobre la 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 e 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 e 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. |