SQL Server 2008: DATE, TIME, DATETIME2, DATETIMEOFFSET ...a la vista!‏ - Percy Reyes's Technical Blog

SQL Server 2008: DATE, TIME, DATETIME2, DATETIMEOFFSET ...a la vista!‏

Con la llegada de SQL Server 2008, algunos de los nuevos tipos de datos que ya son (o serán) novedades tenemos a los siguientes: HIERARCHY ID (para almacenar valores de nodos en un jerarquía), FILESTREAM (para almacenar data de tipo grande, documentos, imágenes), tipos para almacenar datos espaciales como GEOGRAPHY, GEOMETRY, así como los tipos de datos TIME (3 a 5 bytes de tamaño) y DATE (3bytes), DATETIME2 (6 a 8 bytes), DATETIMEOFFSET (8 a 10 bytes), entre otros más.

En este post vamos a hablar acerca de los tipos de datos para manejar fechas y tiempo, es decir, los 4 últimos arriba mencionados. Los otros tipos de datos serán motivos de otro post!.

DATETIME es un tipo de dato compuesto que almacena fecha y tiempo. La novedad es que en SQL Server 2008, el tipo de dato DATETIME se ha separado en dos: DATE y TIME, con esto no quiero decir que DATETIME se haya eliminado, este sigue siendo necesario para otros escenarios, pocos pero en fin. Esta noticia es muy buena ya que por ejemplo, siempre, casi siempre... sólo necesitabamos almacenar la fecha, más no el tiempo, y el único tipo de dato que podiamos usar era DATETIME, el cual "amablemente" guardaba algo más: el tiempo, aunque no lo necesitemos, pues no habia solución. DATETIME aparte de ser un tipo de dato cuyo tamaño es 8 bytes (realmente bastante), es pesado pudiendo originarse problemas de performance general.

Particularmente casi nunca uso DATETIME, prefieron usar con mucho criterio SMALLDATETIME, Porqué?, pues su tamaño es 4 bytes, y para lo que necesito está bien, puedo manejar fechas entre el rango de 1900 y 1979. Obviamente, SMALLDATETIME también almacena la hora, cosa que no se necesita en la mayoria de aplicaciones. De manera semejante sucedía cuando queriamos trabajar sólo con la hora, no había forma de separar la hora de la fecha. Ejemplo:

-- creando un tipo de datos DATE, y asignándole un valor 
DECLARE @FechaTiempo DATETIME
SET @FechaTiempo= GETDATE()
SELECT @FechaTiempo AS FechaTiempo
Resultado:

FechaTiempo
-----------------------
2007-11-03 16:25:53.653

(1 row(s) affected)

Con los tipos de datos DATE y TIME, este problema se soluciona. DATE para almacenar sólo fechas, y TIME para tiempo.

Para asignar valor a un tipo de dato DATETIME usábamos la función del sistema GETDATE(). GETDATE() devuelve un valor de tipo DATETIME. ¿Y cómo asignamos valor a estos nuevos tipos de datos DATE y TIME?, curiosamente la solución es usar GETDATE(). Asi es, pues fíjate que internamente el Database Engine de SQL Server 2008 al detectar que el valor devuelto por GETDATE() será asignado a un tipo DATE o TIME, este filtra sólo la fecha o sólo el tiempo. Veamos un ejemplo:

-- creando un tipo de datos TIEMPO, y asignándole un valor 
DECLARE @Tiempo TIME
SET @Tiempo= GETDATE()
SELECT @Tiempo AS Tiempo
 
-- creando un tipo de datos DATE, y asignándole un valor 
DECLARE @Fecha DATE
SET @Fecha= GETDATE()
SELECT @Fecha AS Fecha
Resultados:

Tiempo
----------------
16:26:22.2800000

(1 row(s) affected)

Fecha
----------
2007-11-03

(1 row(s) affected)

Otro de los tipos para manejar fecha y tiempo son DATETIME2 y DATETIMEOFFSET, a los cuales yo me refiero como extensiones del tipo DATETIME. DATETIME2 es un DATETIME con más precisión y un mayor rangos de años, y con DATETIMEOFFSET se tendrá la posibilidad de manejar fecha y tiempo relacionados a una zona horaria en particular. Cool! :D.

-- creando un tipo de datos DATETIME2, y asignándole un valor 
DECLARE @FechaTiempo2 DATETIME2
SET @FechaTiempo2= GETDATE()
SELECT @FechaTiempo2 AS FechaTiempo2
 
-- creando un tipo de datos DATETIMEOFFSET, y asignándole un valor 
DECLARE @FechaTiempoOFFSET DATETIMEOFFSET
SET @FechaTiempoOFFSET= GETDATE()
SELECT @FechaTiempoOFFSET AS FechaTiempoOFFSET

Resultados:

FechaTiempo2
---------------------------
2007-11-03 16:26:47.8270000

(1 row(s) affected)

FechaTiempoOFFSET
----------------------------------
2007-11-03 16:26:47.8270000 +00:00

(1 row(s) affected)

Finalmente puedo decir que la gente de SQL Server creo que está escuchando mis oraciones, hace tiempo que venía necesitando estos tipos de datos, rogando que existan tipos de datos separados para manejar fecha y tiempo.

Published 4/11/2007 8:57 por Percy Reyes
Comparte este post:

Comentarios

Sunday, November 4, 2007 3:35 PM por Percy Reyes's SQLWebLog @ 3DevNet.com

# SQL Server 2008: DATE, TIME, DATETIME2, DATETIMEOFFSET ...a la vista!‏

Con la llegada de SQL Server 2008, algunos de los nuevos tipos de datos que ya son (o serán) novedades...

Sunday, November 4, 2007 3:36 PM por Percy Reyes's SQLWebLog @ ComunidadesAndinas.com

# SQL Server 2008: DATE, TIME, DATETIME2, DATETIMEOFFSET ...a la vista!‏

Con la llegada de SQL Server 2008, algunos de los nuevos tipos de datos que ya son (o serán) novedades

Monday, November 5, 2007 9:13 AM por Percy Reyes's SQLWebLog @ ComunidadesAndinas.com

# SQL Server 2008: DATE, TIME, DATETIME2, DATETIMEOFFSET ...a la vista!‏

Con la llegada de SQL Server 2008, algunos de los nuevos tipos de datos que ya son (o serán) novedades

Thursday, March 19, 2009 3:58 PM por braian

# re: SQL Server 2008: DATE, TIME, DATETIME2, DATETIMEOFFSET ...a la vista!‏

puedo manejar fechas entre el rango de 1900 y 1979.

WTF!!!!

Sunday, February 21, 2010 1:38 PM por Problema con time desde power builder 10.5

# re: SQL Server 2008: DATE, TIME, DATETIME2, DATETIMEOFFSET ...a la vista!‏

Estoy tratando de utilizar una aplicacion desarrollada en power builder 10.5 que antes se conectaba con base Sybase.Ahora al intentar usar con base SQL SERVER 2008, los datawindows que usan tablas con campos time al accesarlo desde la aplicación se caen con el mensaje "Select Error: Column lists do not match". Hemos intentado probando la conección con varios ODBC, el último que cogimos es el "SQL Server Native Client 10.0" que sí reconoce el tipo de dato time pero se mantiene el error indicado. Por favor alguien puede ayudarme.

Wednesday, September 29, 2010 5:05 PM por jULIO cESAR

# re: SQL Server 2008: DATE, TIME, DATETIME2, DATETIMEOFFSET ...a la vista!‏

muxas gracias

Sunday, October 3, 2010 5:27 PM por Ctezo

# re: SQL Server 2008: DATE, TIME, DATETIME2, DATETIMEOFFSET ...a la vista!‏

Es cierto estos cambios hacen evidenciar un facilidad para trabajanr con los datos de tipo date y time

Monday, May 2, 2011 9:05 PM por Zamora

# re: SQL Server 2008: DATE, TIME, DATETIME2, DATETIMEOFFSET ...a la vista!‏

Todo esta cool