Blog SQL Server de Maximiliano Accotto

Consultoría en SQL Server , servicios de DBA en CONDUIT Soluciones

Trabajando con Fechas y horas con su zona horaria

 

Es muy frecuente tener la necesidad de utilizar fechas y horas incluyendo la zona horaria en nuestras tablas. Esto ayudaría al sistema a poder determinar exactamente en que momento del tiempo se hizo la operación considerando este factor de la zona.

Para ello y a partir de la versión 2008 de SQL Server se dispone de un nuevo tipo de datos DATETIMEOFFSET y varias funciones que lo acompañan.

En este post veremos algunos ejemplos de implementación.

En este primer ejemplo vamos a ver como se puede utilizar este tipo de datos en una tabla y algunas querys sobre ella.

Lo primero que haremos es crear una tabla con la siguiente estructura.

CREATE TABLE #DATOS (ID INT IDENTITY,

                     FECHA DATE,

                     HORA TIME,

                     FECHA1 DATETIMEOFFSET,

                     FECHA2 DATETIME

                    ) 

GO

 

Aquí tenemos un campo llamado FECHA1 que tiene el formato DATETIMEOFFSET y FECHA2 con el tradicional Datetime.

Lo que haremos ahora es insertar algunos registros en la tabla anteriormente creada.

INSERT INTO #DATOS (FECHA,HORA,FECHA1,FECHA2)

VALUES

('20080901','12:00','2008-09-01T12:00:00-03:00','20080901 12:00'),

('20080901','13:00','2008-09-01T13:00:00-03:00','20080901 13:00'),

('20080901','13:00','2008-09-01T13:00:00-02:00', '20080901 13:00'),

('20080901','15:00','2008-09-01T13:00:00+02:00', '20080901 13:00'),

('20090901','15:00','2009-09-01T13:00:00+02:00', '20090901 13:00')

 

Teniendo los registros ya insertados ahora nos haremos las siguientes querys, la primera nos ordena los resultados por Fecha2 (no tiene zona horaria) y luego lo haremos por Fecha1 que si tiene zona horaria.

SELECT * FROM #DATOS

ORDER BY FECHA2

 

SELECT * FROM #DATOS

ORDER BY FECHA1

 

DATETIME2

 

 

Como se puede observar los resultados son totalmente distintos.

Además de poder guardar este tipo de datos, tenemos funciones para poder manipularlo, por ejemplo si deseamos convertir una fecha y hora con zona horaria a otra zona lo podemos hacer con la función SWITCHOFFSET

En los siguientes ejemplos veremos la manipulación del tipo de datos DATETIMEOFFSET anteriormente creado.

SELECT ID,

       FECHA1,

         DATENAME(TZoffset,FECHA1) AS ZONA_HORARIA

FROM #DATOS

 

DATETIME2_2

 

SELECT ID,

       FECHA1,

         SWITCHOFFSET(FECHA1,'-03:00') AS HORA_ARGENTINA

FROM #DATOS

 

Datetime3

Además de esto tenemos nuevas instrucciones para saber la fecha y hora actual, en los campos DateTime usábamos GETDATE() pero este no trae la zona horaria :-(

Entonces podremos utilizar para ello la siguiente función SYSDATETIMEOFFSET().

SELECT SYSDATETIMEOFFSET() AS FECHACOMPLETA

 

DATETIME4

Para aquellos que necesiten trabajar con UTC también existen funciones que representan la hora en este formato,

las mismas son: GETUTCDATE() y SYSUTCDATETIME()

SELECT SYSUTCDATETIME() AS UTC1,

       GETUTCDATE() AS UTC2

 

DATETIME5

 

Conclusiones:

Como se ha podido observar en este post SQL Server tiene todas las posibilidades para que se puedan almacenar y manipular fechas con horas y Zona de una forma transparente y simple.

TweetMe created by sexyselect.net/blog