martes, 24 de enero de 2012

Funciones de fechas en SQL 2012

En éste articulo hablaremos de las nuevas funciones para manejo de fechas que se incoporan en SQL 2012. Son un conjunto de funciones que se llaman xxxFROMPARTS y lo que permiten es ingresar los valores numéricos que forman cada parte de una fecha y retornar en el tipo fecha que corresponda.
Estas funciones son 6, una para que tipo de fecha que maneja el SQL Server. Tomemos como ejemplo la primera para poder fijar la idea.
Si yo tengo tres campos numericos, en uno guardo el dia, en otro el mes y en otro el año, antes debíamos hacer varias operaciones para poder pasar eso a una fecha (string mediante), lo cual siempre me pareció extraño, porque el camino inverso (dada una fecha obtener el número del mes) era posible facilmente con la función DATEPART.
Ahora utilizando la función DATEFROMPARTS le pasamos esos 3 argumentos y nos retorna algo de tipo fecha.
Si en lugar de hacerlo para una fecha lo queremos hacer para una hora, tenemos TIMEFROMPARTS, y así para que tipo de datos "tiempo" que tiene el SQL Server.
Veamos el ejemplo:

-- =============================================
-- Create:        Andrés Aiello
-- Create date: 13/01/12
-- Description: Manejo de fechas en SQL 2012
-- =============================================

SELECT DATEFROMPARTS             ( 2010, 12, 31 ) AS Salida;
SELECT TIMEFROMPARTS             ( 23, 59, 59, 0, 0 ) AS Salida;

SELECT SMALLDATETIMEFROMPARTS    ( 2010, 12, 31, 23, 59 ) AS Salida
SELECT DATETIMEFROMPARTS         ( 2010, 12, 31, 23, 59, 59, 0 ) AS Salida;
SELECT DATETIME2FROMPARTS        ( 2010, 12, 31, 23, 59, 59, 0, 0 ) AS Salida;
SELECT DATETIMEOFFSETFROMPARTS   ( 2010, 12, 31, 14, 23, 23, 0, 12, 0, 7 ) AS Salida;



Pros
  • Es muy cómodo de utilizar
  • Era algo deseable visto que el camino inverso (fecha->número) ya era posible con DATEPART
  • Deja de ser necesario y trabajoso pasar por un VARCHAR para poder transformar una fecha desde sus partes numéricas

Contras
  • Para una transformación es DATEPART pero la vuelta es con otra, no junta los conceptos
  • Muchas funciones para lo mismo en lugar de hacer una sobrecarga y que lo defina el motor
  • Funciones muy "sensibles". Siempre esperan todos los parámetros. Calculo que ésto es consecuencia del punto anterior

Espero sus opiniones.
Saludos!