Novedades en SQL 2008 para desarrollo: Nuevos tipos de datos Fecha

by 11. junio 2009 03:45

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 smile_regular, 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.

Tags:

SQL 2008 | New Sql 2008

Comentarios

19/07/2009 0:48:38 #

Hola Maxi, estuve viendo tu blog, y me parecio bastante interesante.. mira tengo una consulta, quisiera saber si es mejor crear un usuario en sqlserver 2008 por cada empleado que tiene la empresa, o que todos los empleados usen el usuario dbo que viene por defecto en sqlserver 2008.
Gracias de antemano..

Saludos Cordiales

Mario Hidalgo Peru

02/10/2009 14:28:50 #

Hi there, I found your blog on Google while seeking for first aid for a heart attack and your post looks very interesting for me.

personal loan United States

Maximiliano Damian Accotto