2011-02-10 7 views
6

tôi đã cập nhật và xác nhận thời gian sử dụng cho lên lịch báo cáo ... Tôi phải sắp xếp rằng các báo cáo cho ngày trong tương lai và thời gian duy nhất và không hẹn hò trước và time..I đã sử dụng nàyLỗi so sánh ngày giờ trong 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 

Đối ngày phần nó được kiểm tra một cách chính xác nhưng đối với thời gian nó được ném lỗi như

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)'. Đây. bạn cố gắng để có được sự khác biệt trong vài giây trong khi gán nó cho một biến có tên '@ Hr'. Bạn không cần 'HH' thay vì' S'? Ngoài ra, tại sao sử dụng một varchar cho '@ Hr'? – shahkalpesh

Trả lời

1

Không chính xác trả lời câu hỏi của bạn, nhưng có lẽ là một giải pháp cho vấn đề của bạn. Bạn không cần sử dụng DATEDIFF và kiểm tra kết quả, bạn chỉ có thể so sánh hai ngày.

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

Tôi chỉ chạy vào vấn đề này tương tự khi cố gắng để làm một dấu thời gian Unix cuộc hẹn hò,

Dưới đây là một ví dụ về những gì tôi đã cố gắng để làm:

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

Nó tràn từ DATEDIFF đang cố gắng trả lại một số nguyên đã ký - chỉ có thể chứa hơn 68 năm giá trị giây.

Để có được dấu thời gian Unix (mà tôi cần để tôi có thể đưa nó vào Tìm kiếm Nhân sư), bạn có thể nhận được sự khác biệt trong vài phút trước, sau đó đúc kết quả dưới dạng số nguyên lớn và nhân với 60 giây:

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

Bây giờ chúng ta sẽ có thể xử lý các ngày khác nhau về sự khác biệt lên đến 4000 năm hoặc lâu hơn. Nếu bạn cần nhiều phòng hơn, chỉ cần thay đổi phút với khoảng thời gian lớn hơn và lớn hơn, và thay đổi hệ số giây tương ứng.