Aun con el manejo de fechas

Pues si, hace tiempo que se viene confundiendo la gente en como se manejan las fechas dentro de SQLServer, de hecho hace unos anitos me llevo a escribir un articulo (de los tantos que hay por la web) sobre este tema. Pero aun el problema continua y es muy pero  muy frecuente en cada foro o charla que alguien pregunte como se trabaja con esto y se haga unos rollos de aquellos.


Bueno aqui voy a marcar algunos tips nuevamente:


Primero, los tipos de datos para manejar fechas en sql son el Datetime o el SmallDatetime, en ambos casos se guarda fecha/hora. Como todos sabemos hay paises donde las fechas se representan de distintas maneras, por ej los americanos usan el formato MM/dd/YYYY mientras que latonoamerica y espania usan el dd/mm/yyyy, bueno ya se empieza a complicar la cosa no?


Como resolver esto y que siempre mis fechas funcionen sin depender de donde lo esten haciendo? como todo en la vida cuando la cosa se pone feita se genera un Standard [:)] , para las fechas tenemos el ISO YYYYMMDD HH:mm:ss el cual si usamos en TODO nuestra manejo de este tipo de datos (insert, update, wheres) no tendremos de que preocuparnos y no nos aparecera el error comun de que nuestra fecha esta fuera de rango.


SQL server define el formato de la fecha segun el idioma que tenga definido el login, no tiene nada que ver con la configuracion regional de la maquina, esto es una gran confusion que hay.


Como ya mencionamos antes, las fechas se guardan tambien las horas, entonces si nos piden consultar los registros del 1/12/2006 deberiamos hacer


SELECT CAMPOS FROM TABLA WHERE FECHA >=’20061201′ AND FECHA <‘20061202′


Esto consultara todos los registos de esa fecha ya que considera todo el espectro de horas.


Algo comun es que cuando quieren consultar por ej por un mes determinado hagan algo asi como:


SELECT CAMPOS FROM TABLA WHERE MONTH(FECHA) = 4


Esto a simple vista no tiene problemas y parece simple no? pues es patetico este query, si aplican una funcion sobre un campo a la izquierda de la condicion esto hara que si hay indices por esta columna NO SE UTILICEN de forma eficiente.


Entonces para resolver este tipo de queys es aconsejable poner el rango de fechas para ese mes o si realmente quieren hacerlo de forma mas simple y sera algo recurrente, podrian crear una columna calculada en sus tablas que de como resultado el mes, a esa columna calculada le crean un indice y ahi si consumen por esa columna calculada [:)] .


Bueno espero que este tema de las fechas quede claro