2011-02-10 4 views
6

Я использовал дату и время проверки для планирования отчета ... Я должен запланировать, что отчеты для будущей даты и времени только и не предыдущая дата и time..I использовали этотОшибка сравнения даты и времени в 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 

Для части даты он правильно проверять, но и для времени он бросает ошибку как

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)'. Вот. вы пытаетесь получить разницу в секундах, назначая ему переменную с именем '@ Hr'. Вам не нужно 'HH' вместо' S'? Кроме того, зачем использовать varchar для '@ Hr'? – shahkalpesh

ответ

1

Не точно ответить на ваш вопрос, но, возможно, решение вашей проблемы. Вам не нужно использовать DATEDIFF и проверять результаты, вы можете просто сравнить две даты.

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

Я просто столкнулся с этой же проблемой при попытке сделать метку времени Unix с даты,

Вот пример того, что я пытаюсь сделать:

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

Он переливается так DATEDIFF пытается вернуть целое число со знаком, которое может содержать только 68 секунд.

Чтобы получить временную метку Unix (которая мне нужна, чтобы я мог ее подавать в Sphinx Search), сначала вы можете получить разницу в минутах, а затем передать результат как большое целое число, а затем умножить на 60 секунд:

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

Теперь мы сможем обрабатывать даты, которые варьируются в зависимости от расстояния до 4000 лет или около того. Если вам нужно еще больше места, просто измените минутку с большими и большими интервалами и соответствующим образом измените множитель секунд.

Смежные вопросы