¡Descubre Cómo Declarar y Gestionar Fechas y Horas en Bases de Datos de Forma Fácil y Rápida!post-template-default single single-post postid-46 single-format-standard et_pb_button_helper_class et_fixed_nav et_show_nav et_secondary_nav_enabled et_primary_nav_dropdown_animation_fade et_secondary_nav_dropdown_animation_fade et_header_style_left et_pb_footer_columns4 et_cover_background et_pb_gutter et_pb_gutters3 et_right_sidebar et_divi_theme et-db
771 715 4434

Uno de los retos más importantes que vamos a enfrentar cuando trabajamos con datos es la gestión de las fechas y horas. Al igual que nos pasaba con los datos numéricos, elegir el tipo de datos de fecha y/o hora correcto es de vital importancia y no debe ser ignorado. A primera vista, esto parece sencillo, pero la realidad es más compleja.

La Evolución de los Tipos de Datos de Fecha y Hora en SQL Server

Manejar correctamente los tipos de datos de fecha y hora en SQL Server o Azure SQL es esencial para mantener la integridad de los datos y realizar cálculos precisos. SQL Server ha incorporado nuevos tipos de datos para administrar la información sobre la fecha y hora, mejorando significativamente las capacidades respecto a versiones anteriores.

Tipos de Datos Anteriores a SQL Server 2008

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 dificultaba trabajar solo con valores de fecha o de hora. Datetime y SmallDatetime son los tipos de datos más antiguos y existen desde las primeras versiones de SQL Server. Nos van a permitir manejar las fechas y las horas sin demasiada complicación, aunque por contra perderemos detalle comparado con otros tipos más modernos. Además, estos tipos de datos solo admiten las fechas posteriores a la introducción del calendario gregoriano en Inglaterra en 1753. La precisión del tipo de datos datetime es de hasta 3 milisegundos.

Nuevos Tipos de Datos Introducidos en SQL Server 2008

Con la llegada al mercado de SQL Server 2008 se introdujeron los tipos de datos Date y Time. 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. Tanto SQL Server como Azure SQL ofrecen varios tipos de datos para trabajar con fechas y horas: datetime, smalldatetime, date, time, datetime2 y datetimeoffset. 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.

Tipo de Dato 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.

Lea también: IVA 21% Excel

Tipo de Dato time

El tipo de datos time solo almacena valores de hora basados en un reloj de 24 horas. 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).

Tipo de Dato 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. Es una evolución del tipo de datos datetime que tiene una mayor precisión y un rango de fechas más amplio. Puede tener una precisión de hasta 100 nanosegundos, lo que lo convierte en compatible con los estándares ANSI e ISO 8601. Su rango abarca desde el 0001-01-01 00:00:00.0000000 hasta el 9999-12-31 23:59:59.9999999. Como ya hemos visto, Datetime2 es especialmente interesante debido a su gran precisión y rango. Esto, que a priori es una ventaja, puede llevarnos a errores cuando convertimos a Datetime2 desde Datetime, ya que la precisión faltante no se rellena con ceros, sino que puede ser completada con valores no esperados si la información original no es lo suficientemente precisa.

Tipo de Dato datetimeoffset

El tipo de datos datetimeoffset incluye todas las características de datetime2 con un desfase de zona horaria adicional. Es similar a datetime2, pero incluye información sobre la zona horaria. 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.

Análisis y Formato de Fechas y Horas en SQL Server

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. La instrucción SET LANGUAGE de Transact-SQL establece implícitamente DATEFORMAT, que determina el orden de las partes de la fecha. 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. Además de los tipos de datos, un aspecto clave en la representación de las fechas almacenadas en la base de datos es el estilo. Por defecto, se muestra en formato Año, Mes y Día seguido de la hora en Horas, Minutos, Segundos y Milisegundos. Puede especificar tipos de datos de fecha y hora mediante una variedad de formatos de cadena literales diferentes, que SQL Server evalúa en tiempo de ejecución y los convierte en estructuras internas de fecha y hora. SQL Server reconoce los datos de fecha y hora que se incluyen entre comillas simples (').

Gestión de Parámetros de Fecha y Hora en .NET con SQL Server

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. También puede proporcionar parámetros mediante el método AddWithValue de un SqlCommand. Al trabajar con los nuevos tipos de datos de datetime, hay que definir explícitamente la propiedad SqlDbType del parámetro al tipo de datos correspondiente de la instancia. 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. 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 del DbType del objeto de parámetro. Es importante destacar que no se han introducido nuevos tipos de datos de System.Data.SqlTypes para admitir los nuevos tipos de datos de fecha y hora. Cuando se envía un valor de parámetro nulo al servidor, se debe especificar DBNull, en lugar de null (Nothing en Visual Basic).

Lea también: Guía IVA reducido

Consideraciones Generales para el Almacenamiento de Fechas y Horas en Bases de Datos

Elegir el tipo de datos adecuado para almacenar fechas y horas es de vital importancia y no debe ser ignorado. Siempre deberías usar el tipo de datos más sencillo que se ajuste a tus necesidades. Esto significa que si puedes usar date en lugar de date-time, deberías hacerlo. Aunque puede parecer un tema sencillo al principio, es más complejo cuando empiezas a trabajar con ello y a profundizar. Lo más simple es siempre lo mejor. Si no vas a trabajar mucho con las fechas, usa el texto.

Almacenamiento como Texto (VARCHAR/TEXT)

Una recomendación general es guardar fechas, fechas y horas u horas en una base de datos usando el campo de tipo texto, al menos que realmente necesites otro tipo de dato. También es recomendable dejarle todo el trabajo de formatos y operaciones al lenguaje de programación, usando la base de datos únicamente para lo que es: almacenar. Al usar el tipo de dato texto (text, varchar o como se denomine en su motor) podrás comparar fechas y horas, así como recuperarlas fácilmente como cadenas. Es decir, estarán serializadas. Ya después puedes crear un objeto a partir de esa fecha, pero lo importante es que estarán serializadas como cadenas y no importa el motor de base de datos que utilices, pues todos permiten guardar texto plano.

Almacenamiento como Tipo de Dato Nativo (DATE, DATETIME, TIME)

Si quieres, puedes usar el tipo de dato llamado date, datetime, time o fecha. Esto permitirá usar funciones nativas del motor para sumar, restar, filtrar por año, etcétera. Este enfoque es recomendable si tienes acceso a la configuración del motor para modificar los locales y la zona horaria (dado que a veces en los hosting compartidos no permiten modificar esos valores) y si vas a trabajar con fechas para sumar, restar, filtrar por año, mes, sacar diferencias, etcétera, y necesitas consultar y filtrar usando estas operaciones. No obstante, este enfoque puede obligar a usar siempre el mismo motor de base de datos, lo que puede generar problemas al exportar o migrar.

Comparativa de Funcionalidades: Texto vs. Tipo Nativo

Al final, la decisión sobre el tipo de dato que utilices queda en ti. Si vas a trabajar mucho con las fechas, entonces elige el tipo de dato que es para guardarlas. Ahora veamos qué se puede hacer con cada tipo de dato al guardar fechas en bases de datos.

Rango y Ordenación

Si quieres comparar u ordenar, puedes usar el operador mayor y menor qué como texto. Dado que las fechas se pueden comparar lexicográficamente, podrías comparar si está en un rango con una cláusula como: where fecha >= "2020-01-01" AND fecha <= "2022-12-12". Incluso con horas, ya que las fechas y horas también se pueden ordenar alfabéticamente. Si guardas las fechas como date o datetime, podrás usar las funciones del motor. Por ejemplo, en MySQL o MariaDB existe YEAR y funciones similares. En cambio, con el texto, tendrías que usar algo como un substring para cortar la cadena. En algunos casos, se utiliza strftime para filtrar por año en el lenguaje de programación.

Lea también: ¿Cómo localizar tus XML del SAT?

Suma y Resta de Fechas

En este aspecto, el texto no puede servir de nada; lo mejor es usar un tipo de dato de tipo date o extraer los campos y luego usar el lenguaje de programación para hacerlo. Lo malo de usar al lenguaje de programación en lugar del motor de base de datos es que no puedes hacer un WHERE con los resultados; tendrías que obtener todos los datos, calcular la operación y luego filtrar.

Diferencia de Fechas (Tiempo Transcurrido)

Similar a la suma y resta, no es posible calcular diferencias de fechas usando solo texto. Vas a necesitar el tipo de dato nativo o el lenguaje de programación para hacer los cálculos.

La Complejidad Inherente de las Fechas y Horas

Las fechas y las horas son complicadas porque tienen que reconciliar dos fenómenos físicos (la rotación de la Tierra y su órbita alrededor del sol) con todo un conjunto de fenómenos geopolíticos que incluyen a los meses, los husos horarios y los horarios de verano. Estamos seguros que sabes que no todos los años tienen 365 días, ¿pero acaso conoces la regla entera para determinar si un año es bisiesto? (Tiene tres partes, de hecho). Puedes recordar que muchas partes del mundo usan horarios de verano, así que algunos días tienen 23 horas y otros tienen 25.

Los husos horarios son un tema enormemente complicado debido a su interacción con entidades geopolíticas. El primer desafío es que los nombres comunes de los husos horarios tienden a ser ambiguos. Por ejemplo, si eres estadounidense, probablemente te sea familiar la sigla EST, (del inglés de Tiempo Este Estándar). Sin embargo, ¡Canadá y Australia también tienen EST! Para evitar la confusión, se usa el estándar internacional IANA para husos horarios. Estos tienen un esquema de nombres que sigue el formato "<área>/", típicamente escrito como "/", en idioma inglés. UTC (Tiempo Universal Coordinado) es el huso horario estándar empleado por la comunidad científica y es aproximadamente equivalente a su predecesor GMT (siglas en inglés de Tiempo del Meridiano de Greenwich). UTC no tiene horario de verano, por lo que resulta una representación conveniente para la computación.

tags: #como #declarar #hora #en #base #de