2011-02-10 14 views
6

He utilizado la fecha y hora de la validación de la programación de un informe ... tengo que programar para que los informes de fecha futura y el tiempo solamente y no la fecha anterior y time..I han utilizado esteError de comparación de fecha y hora en sql?

declare @Dt varchar(50) 
    declare @Hr varchar(50) 
    declare @trandate_time_tmp as TIME(0) 

    select @trandate_time_tmp = getdate() 
    set @Dt = DATEDIFF (D,@schedule_date ,@trandate_tmp) 
    set @Hr = DATEDIFF (S,@schedule_date ,@trandate_time_tmp) 

    if (@Dt > 0) 
    begin 
     raiserror('Schedule Date should not be earlier than system date',16,1) 
     return 
    end 

    if (@Hr > 0) 
    begin 
     raiserror('Schedule Time should not be earlier than system time',16,1) 
     return 
    end 

Por parte de fecha se está comprobando correctamente, pero por el tiempo que está lanzando el error como

The datediff function resulted in an overflow. The number of dateparts separating two date/time instances is too large. Try to use datediff with a less precise datepart. 
+1

'set @Hr = DATEDIFF (S, @ schedule_date, @ trandate_time_tmp)'. Aquí. Estás tratando de obtener la diferencia en segundos mientras la asignas a una variable llamada '@ Hr'. ¿No necesitas 'HH' en lugar de' S'? Además, ¿por qué usar un varchar para '@ Hr'? – shahkalpesh

Respuesta

1

No exactamente respondiendo a su pregunta, pero tal vez una solución a su problema. No necesita usar DATEDIFF y verificar los resultados, simplemente puede comparar las dos fechas.

IF (@schedule_date <= GETDATE()) 
BEGIN 
    RAISERROR('Schedule date should not be earlier than system date', 16, 1) 
    RETURN 
END 
0

Me acabo de encontrar con este mismo problema cuando se trata de hacer una marca de tiempo Unix de una fecha,

He aquí un ejemplo de lo que estaba tratando de hacer:

select DATEDIFF(second,'1970-01-01','2200-01-11'); 

Se desborda desde DATEDIFF intenta devolver un entero con signo, que solo puede contener un valor de segundos de 68 años.

Para obtener la marca de tiempo de Unix (que necesito para poder alimentarla a Sphinx Search), primero puede obtener la diferencia en minutos, luego arrojar el resultado como un entero grande y luego multiplicar por 60 segundos:

select CAST(DATEDIFF(minute,'1970-01-01','2200-01-11') AS BIGINT) * 60; 

Ahora deberíamos ser capaces de manejar fechas que varían en una diferencia de hasta 4000 años más o menos. Si necesita aún más espacio, simplemente cambie el minuto con intervalos más grandes y más grandes, y cambie el multiplicador de segundos en consecuencia.

Cuestiones relacionadas