Con este post estoy inaugurando una nueva sección en mi blog. La idea es ir mostrando con ejemplos prácticos las distintas novedades que tenemos en SQL Server 2008 para el desarrollador.
La mayoría de los post estarán orientados a la parte de programación.
Tratare de poner por lo menos un post distinto por semana.
En este primer post mostrare los nuevos tipos de datos relacionados con fechas y horas.
Estos nuevos tipos de datos están disponibles en todas las ediciones de SQL (Express, Workgroups, Web, Standard, Enterprise, Developer)
Introducción:
Hasta versiones anteriores a SQL 2008 disponíamos para guardar nuestras fechas y horas de dos tipos de datos Datetime y SmallDatetime.
En ambos tipos de datos se guardaba tanto la fecha como la hora.
El Datetime nos permite guardar fechas desde 1/1/1753 hasta el 31/12/9999, en cambio el SmallDatetime nos permite solo guardar los rangos que van desde 1/1/1900 hasta el 6/6/2079 y además tiene menos precisión que el anterior.
Uno de los grandes problemas de estos tipos de datos (podríamos decir mas que un problema una comodidad quizás) es que tanto la fecha como la hora se guardan ahí mismo, entonces si solo quiero guardar fechas debería siempre la hora ponerla en 00:00:00 y si solo quiero guardar horas la cosa se complica un poco mas y debería quizás tomar un valor estándar a nivel fecha , por ejemplo 1/1/1900.
Esto funciona lo mas bien pero es una incomodidad para la mayoría de los que desarrollamos.
Yo igual recomiendo siempre que se utilice el tipo de dato adecuado sin inventos, si hay que guardar fechas u horas usen datetime o smalldatetime en versiones anteriores a 2008.
También recuerden que la fechas no se guardan en ningún formato especial (dd/mm/yyyy o mm/dd/yyyyy) sino que se almacenan en bytes y luego el SQL las manipula según el idioma que tengamos definido en nuestro login, para lo cual es recomendable siempre manejarlas en formato ISO YYYYMMDD HH:mm:ss
Nuevos tipos de datos en 2008
En la versión 2008 disponemos de nuevos tipos de datos para el manejo de fechas
Date:
Permite guardar solo la fecha con un rango que va desde el 0001-01-01 hasta el 9999-12-31
Aquí vemos un par de ejemplos
DECLARE @FECHA DATE
SET @FECHA = getdate()
SELECT @FECHA
CREATE TABLE #DEMO1 (FECHA DATE)
go
INSERT INTO #DEMO1 VALUES ('20090610')
GO
Time:
Este tipo de datos solo almacena la hora en un rango que va desde las 00:00:00.0000000 hasta las 23:59:59.9999999
DECLARE @HORA TIME
SET @HORA = getdate()
SELECT @HORA
CREATE TABLE #DEMO2 (HORA TIME)
go
INSERT INTO #DEMO2 VALUES ('12:30:00')
GO
Datetimeoffset
Este tipo de dato para mi es uno de los que yo mas esperaba y que realmente ayuda y mucho.
Hasta aquí hemos hablado de fechas y horas generales pero en ningún momento dijimos en que zona horaria esta una fecha, imaginemos que hacemos un sistema donde hay transacciones en distintas zonas geográficas, obviamente que una operación a las 10 AM –3 no es lo mismo que a las 10 AM –5.
Hasta versiones anteriores no teníamos forma de poder resolver este problema de forma simple, lo que yo hacia básicamente era tener una columna adicional smallint en la cual indicaba la zona horaria.
Bueno ahora por suerte en SQL 2008 disponemos de un tipo de datos que incluye la zona horaria, y ese tipo de datos es el Datetimeoffset.
Este tipo de dato guarda la fecha la hora y la zona horaria con un rango que va desde 0001-01-01 hasta 9999-12-31
Veamos un par de ejemplos
CREATE TABLE #DATOS (ID INT IDENTITY,
FECHA_HORA_UTC DATETIMEOFFSET
)
GO
-- INSERTAMOS ALGUNOS REGISTROS
INSERT INTO #DATOS (FECHA_HORA_UTC)
VALUES ('2008-09-01T12:00:00-03:00'),
('2008-09-01T13:00:00-03:00'),
('2008-09-01T13:00:00-02:00'),
('2008-09-01T13:00:00+02:00'),
('2009-09-01T13:00:00+02:00')
GO
SELECT * FROM #DATOS
SELECT * FROM #DATOS
ORDER BY FECHA_HORA_UTC -- ORDENADO OFFSET
Podemos observar que el segundo query ordena las transacciones respetando la zona horaria donde por ejemplo la primer transacción es la numero 4 ya que su zona horaria es + 2 y tiene la misma fecha y hora que la operación 1,3 y 2
DateTime2
Este nuevo tipo de dato soporta fecha y hora pero se diferencia del Datetime clásico por el rango que va desde
0001-01-01 hasta 9999-12-31
Conclusiones Finales
Sql Server 2008 adiciona nuevos datos con respecto al manejo de fechas, ahora si tenemos el set completo
, como siempre recomiendo utilicen los tipos de datos adecuados, por ejemplo no usen un char o int para almacenar fechas u horas, en 2000 y 2005 usen Datetime y en 2008 tienen mas amplitud, la ventaja de usar los tipos de datos adecuados es también la posibilidad de usar funciones de forma simple, por ejemplo podríamos usar un Datepart cualquier tipo de datos fecha/hora.
Espero que este post los ayude.