Introducción a las fechas en SQL Server

En este post quiero tratar de explicar cómo usar las fechas en SQL Server y que cosas debemos tomar en consideración pero antes voy a tratar de explicar que son para SQL Server, el cual, tiene básicamente dos tipos de datos donde se pueden almacenar las mismas: Datetime y SmallDateTime, en este cuadro veremos las diferencias entre estos dos tipos de datos.

DateTime Valores de Fecha y Hora que están comprendidos entre 1/1/1763 y 31/12/9999. La hora se expresa con una exactitud de hasta 1/300 de segundo
SamallDateTime Valores de Fecha y Hora que están comprendidos entre 1/1/1900 y 6/6/2079. El grado de precisión de la hora llega hasta el minuto

¿Cómo guarda internamente SQL Server las fechas? El motor de SQL Server siempre guarda las fechas de una sola forma y no esta referida a ningún formato concreto como podría ser Americano, Español, Japonés, etc.; SQL Server guarda las fechas DateTime como enteros de 4 bytes (los primeros 4 bytes almacenan la fecha y los otros 4 la hora), en SmallDatetime como tienen menor precisión en lugar de ser dos grupos de 4 son dos grupos de 2.

¿Entonces porque cuando hago alguna consulta me devuelve las fechas en un formato concreto? Esto es así porque leer las fechas en grupos de bytes no es muy elegante y el formato dependerá de que idioma tenga definido nuestro usuario.

Entonces, si las fechas las devuelve según el idioma que tenga definido el usuario, ¿Cómo hacer una consulta de fechas en un formato y no morir en el intento? Hay una solución muy simple que pasa por el uso del Standard ANSI para las fechas, este Standard esta compuesto así: YYYY-MM-DD HH:mm:ss, si se utiliza este formato para las consultas no tendremos problemas en ninguna aplicación por más que nuestro usuario este configurado en Ingles, Español o lo que fuere, ni tampoco si en un Windows tengo definido en su configuración regional cualquier cosa.

Si no lo hacemos de esta forma nuestras consultas no van a ser reutilizables con sistemas con otro idioma, por ejemplo, si consultas una fecha con el formato 'dd-MM-yy' a una base de datos configurada para 'MM/dd/yyyy' te dará un error, por lo que deberás definir previamente (reiniciando posteriormente el motor de SQL) que formato de lenguaje utilizar, y la definición de idioma es algo global que se aplica a todas las bases de datos del servidor, así que hay que tener cuidado con ello. Para consultar el idioma por defecto de nuestro motor de bases de datos ejecutaremos la siguiente consulta:
SELECT @@LANGUAGE 
Y para cambiarlo:
SET LANGUAGE Spanish
exec sp_defaultlanguage sa, 'spanish' 
Luego reiniciamos el servidor y de esta forma tendríamos nuestro SQL Server en el idioma deseado, pero repito, es mucho mejor y más usable y reutilizable tener nuestras consultas en formato standard para evitarnos futuros quebraderos de cabeza.

Bien ahora tenemos casi el 90% resuelto de los problemas más habituales con fechas, pero de todos modos no deberíamos dejar de ver las funciones que están asociadas con la manipulación de las mismas.

Función Determinismo
DATEADD Devuelve un valor datetime nuevo que se basa en la suma de un intervalo a la fecha especificada.
DATEDIFF Devuelve el número de límites de fecha y hora que hay entre dos fechas especificadas.
DATENAME Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha especificada.
DATEPART Devuelve un entero que representa la parte de la fecha especificada de la fecha indicada..
DAY Devuelve un entero que representa la parte del día de la fecha especificada.
GETDATE Devuelve la fecha y hora actuales del sistema en el formato interno estándar de Microsoft® SQL Server™ para los valores datetime.
GETUTCDATE Devuelve el valor de datetime que representa la hora UTC actual (Universal Coordinated Time u hora del meridiano de Greenwich). La hora UTC actual se deriva de la hora local actual y la configuración de zona horaria del sistema operativo del equipo en el que se ejecuta SQL Server.
MONTH Devuelve un entero que representa el mes de una fecha especificada.
YEAR Devuelve un entero que representa la parte de año de la fecha especificada.

En el siguiente enlace podremos encontrar mucha más información sobre los tipos de datos y funciones de fecha y hora utilizados en el lenguaje Transact-SQL en SQL Server 2012, la última versión actual (julio 2012) de este motor de bases de datos.

El uso de las fechas es un gran problema si no lo sabemos entender y nos puede traer muchos dolores de cabeza, pero además de esto es muy importante que nuestras consultas puedan estar en su mayoría (hay casos donde esto no es viable) dentro de procedimientos almacenados (Stores Procedures) y saber que T-SQL no es un lenguaje de programación por tanto hay que usarlo solo para lo que fue creado.

Comentarios