2011-02-10 99 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`?另外,为什么使用`@ Hr`的varchar? – shahkalpesh 2011-02-10 07:06:24

回答

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年左右的日期。如果您需要更多空间,只需更换更大和更大的时间间隔,然后相应更改秒倍数。