1 comentario

Mejores practicas para manejo de fechas en SQLServer


Manejando fechas de la manera correcta en SQLServer

Si eres desarrollador con SQLServer, seguramente alguna vez te habras encontrado con algun problema derivado con campos tipo fecha,  si claro es tipico, bueno aqui te dejo un post con una recomendación que te podria salvar la vida en el futuro o al menos te ahorraria algunos topes contra la pared.

ANSI,Datetime, Fechas, Formato fechas, SQLServer

Creo que siempre existe un tope en el tema del manejo de fechas en SQLServer, de modo que voy a tratar de clarificar algunos puntos en este artculo.

Existen dos tipos de datos para almacenar fecha enSQLServer,

Datetime y SmallDatetime.

La diferencia entre ambas es el espacio que ocupan y la precisin de cada tipo de datos

.Datetime es el tipo de datos mas preciso.

El punto es saber como es que SQLServer almacena internamente las fechas. Algunos pensarn en los formatos comunes mm/dd/yyyy o dd/mm/yyyy o formatos similares. Pero no es as.

SQL Server en realidad almacena las fechas como un nmero entero de 8 bytes, con los primeros 4 bytes almacenados fecha y los otros 4 bytes almacenado la hora. El Smalldatetime por su parte ocupa la mitad de esto, 4 bytes totales, 2 para fecha y 2 para la hora.

Ahora bien, como gente astuta que son me preguntaran porque motivo  los selects traen la fecha en un formato dado(americano/español, japones, coreano, papuense, etc)????

Ese formato me genera un problema al momento de filtrar por fechas, porque 3/1/2008 podra en realidad resultar el 1 de marzo del 2008 y no el 3 de enero del 2008. Me explico hasta aqui??

Como hago entonces para librarme de las configuraciones regionales, seteos, formatos y ser libre de todas estas cosas y despreocuparme por siempre y que mis consultas filtradas por fechas funcionen siempre??

Alguno de ustedes dira que quizas usando el

Standard ANSI y yo le contesto SI ! Esa es la respuesta !. El estandar ansi es as: YYYYMMDD HH:mm:ss

Ese es el formato que yo tendria que usar para mis consultas.

Veamos el caso ejemplificado con Northwind la cual viene con SQLServer 2000 o pueden bajarlo directamente desde Microsoft en el peor de los casos.

/* Creo un usuario con idioma predeterminado en Español */

  sp_addlogin‘usuario’,‘pepenervos’,‘master’,‘Espaol’

/* vamos a darle acceso a Northwind */

use

Northwind

GO

sp_grantdbaccess ‘usuario’ 

GO

Nos logueamos en el Query Analizer como “usuario”

.Con la siguiente instruccion confirmamos el idioma espaol para el usuario “usuario”:

Select @@Language

La consulta devuelve:

——————————————————— Español (1 filas afectadas)

Ahora usamos la tabla Orders y hacemos la consulta de fechas de la forma tradicional y la segunda usando el formato ANSI propuesto.

use

northwind

go

 — la opcion que siempre hemos usado hasta hoy que os he mostrado el camino select count(*) from orders where orderdate >=’01-08-1997′  

 — La opcion que cambiara tu vida. select count(*) from orders where orderdate >=’19970801′

Ambas consultas devuelven 460 registros para pedidos posteriores al 1 de agosto del 97.

Cambiamos el lenguaje al idioma ingls y volvemos a probar a ver que pasa

.

use

northwind

go

 

SET

LANGUAGE us_english

GO

  — ya dijimos que esta opcin no corre mas. select count(*) from orders where orderdate >=’01-08-1997′ 

 — la opcion ANSI que hizo que dejes de sufrir. select count(*) from orders where orderdate >=’19970801′ 

La primera consulta devolvi 670 registros y la segunda sigue devolviendo la cantidad correcta

, 460 registros. Lo que ocurri es que al cambiar el formato regional la primera consulta en realidad est buscando registros mayores el 8 de enero y eso no tiene nada que ver con el 1 de agosto que nosotros queremos filtrar !

La segunda sentencia sigue siendo correcta, de modo que ya saben, a usar el formato ANSI que se acaba el mundo.

Y si quiero traer solamente los registros de un solo da, teniendo en cuenta que el ansi me toma la hora y eso puede hacer que no devuelva todos los registros de ese dia, podemos escribir algo como lo que sigue:

Select * from orders Where orderdate >=‘19970805’and orderdate <>

En pocas palabras, le sumo un dia a la fecha que estoy buscando y hago que el filtro funcione por menor a ese dia, de ese modo vienen todos los registros del dia que quiero recuperar.

Y listo el pollo

.

Una solucin sencilla y efectiva al tema de las fechas

 

Espero le sirva

 

Hugo Román Bernachea Mail de contacto: SQLServer777@gmail.com

http://sqldata.blogspot.mx/2008/09/manejando-fechas-de-la-manera-correcta.html

.

Anuncios

Un comentario el “Mejores practicas para manejo de fechas en SQLServer

  1. Se robaron esto de otro blog.
    Pésimo.

Si te sirvio o te gusto el post, deja un comentario, o vota por el blog, esto nos ayuda a seguir creciendo, Gracias

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: