En lo personal creo que sql server 2005 falla al no respetar el estàndar sql que especifica que debe de existir un tipo DATE y un tipo TIME por separado. En cambio, aglomera en un solo tipo ( datime o smalldatetime ) hora y fecha. También falla en no dar una función simple que sirva para este propósito específico que es tan necesario. Una función pequeña es una función màs eficiente. En este caso yo no necesito toda la potencia de una funciòn tan genèrica como DATEDIFF ( la cual devuelve la diferencia entre dos fechas, sòlo requiero saber si son iguales, o si una es mayor), asì que hice mi propia implementacion que regalo a quien la quiera usar:
El propòsito de esta función es comparar únicamente 2 fechas. Devuelve un 1 si la primera fecha es mayor, un -1 si la primera fecha es menor y un 0 si las fechas son iguales.
--
Código:
-- =============================================
-- Autor: David Bernal Michelena
-- Descripción: Compara dos fechas, si la fecha1 es mayor devuelve un 1, si es menor devuelve un -1, si las fechas son iguales devuelve 0
-- =============================================
CREATE FUNCTION comparaFecha ( @fecha1 SMALLDATETIME, @fecha2 SMALLDATETIME )
RETURNS int
AS
BEGIN
DECLARE @res int
IF YEAR(@fecha1) > YEAR(@fecha2)
SET @res = 1
ELSE
IF YEAR (@fecha1) < YEAR(@fecha2)
SET @res = -1
ELSE -- AÑOS IGUALES
IF MONTH(@fecha1) > MONTH(@fecha2)
SET @res = 1
ELSE
IF MONTH(@fecha1) < MONTH(@fecha2)
SET @res = -1
ELSE -- AÑOS Y MESES IGUALES
IF DAY(@fecha1) > DAY(@fecha2)
SET @res = 1
ELSE
IF DAY(@fecha1) < DAY(@fecha2)
SET @res = -1
ELSE -- AÑOS, MESES Y DIAS IGUALES
SET @res = 0
RETURN @res
END
;
Para probar la funcion, usar el siguiente código:
Código:
DECLARE @fechaInicio SMALLDATETIME,
@fechaFin SMALLDATETIME
SELECT @fechaInicio = '15/01/2009'
SELECT @fechaFin = '01/06/2009'
IF ( <usuario>.comparaFecha( @fechaInicio, @fechaFin) = 1)
PRINT 'HAY UN ERROR'
ELSE
PRINT 'CORRECTO, LA FECHA FINAL ES POSTERIOR O IGUAL A LA INICIAL'
En <usuario> deben de poner el nombre de usuario de la bd, si ponen sólo el nombre de la funcion, no funcionará.