2011-02-10 18 views
6

Ho usato la data e la validazione di tempo per la pianificazione di un rapporto ... devo programmare che i rapporti per data futura e l'ora e non la data precedente e time..I hanno usato questaErrore di confronto con data/ora in 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 

Per data di parte si sta controllando in modo corretto, ma per il tempo che sta gettando errore

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)'. Qui. stai cercando di ottenere la differenza in secondi mentre lo assegni a una variabile chiamata '@ Hr'. Non hai bisogno di 'HH' invece di' S'? Inoltre, perché usare un varchar per '@ Hr'? – shahkalpesh

risposta

1

Non esattamente rispondere alla tua domanda, ma forse una soluzione al vostro problema. Non è necessario utilizzare DATEDIFF e controllare i risultati, è sufficiente confrontare le due date.

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

Ho appena imbattuto in questo stesso problema quando si cerca di fare un timestamp Unix da una data,

Ecco un esempio di quello che stavo cercando di fare:

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

E trabocca dal DATEDIFF sta cercando di restituire un intero con segno, che può contenere solo oltre 68 anni di valore in secondi.

Per ottenere il timestamp Unix (che è necessario in modo che io possa inserirlo nella ricerca Sphinx), è possibile ottenere la differenza in minuti prima, quindi inserire il risultato come un numero intero grande e quindi moltiplicarlo per 60 secondi:

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

Ora dovremmo essere in grado di gestire date che variano in differenza fino a 4000 anni circa. Se hai bisogno di più spazio, cambia semplicemente il minuto con intervalli sempre più grandi e modifica il moltiplicatore dei secondi di conseguenza.

Problemi correlati