2009-03-11 58 views
6

tuyên bố chọn này mang lại cho tôi được thông báo lỗi số học:lỗi tràn số học chuyển đổi biểu thức để kiểu dữ liệu datetime

SELECT CAST(FLOOR((CAST(LeftDate AS DECIMAL(12,5)))) AS DATETIME), LeftDate 
FROM Table 
WHERE LeftDate > '2008-12-31' 

Trong khi người ta này hoạt động:

SELECT CAST(FLOOR((CAST(LeftDate AS DECIMAL(12,5)))) AS DATETIME), LeftDate 
FROM Table 
WHERE LeftDate < '2008-12-31' 

Có thể có một cái gì đó xảy ra với dữ liệu (Tôi đã kiểm tra các giá trị null và không có giá trị nào)?

Trả lời

9

Tìm thấy sự cố xảy ra khi một ngày được đặt thành 9999-12-31, có thể là lớn đối với số thập phân cần xử lý. Thay đổi từ thập phân sang phao, và mọi thứ đều hoạt động như một sự quyến rũ.

7

Nói chung, việc chuyển đổi ngày thành số hoặc chuỗi, để thực hiện các hoạt động ngày trên số, là rất không hiệu quả. (Các chuyển đổi là tương đối chuyên sâu, như là thao tác chuỗi.) Nó là tốt hơn để dính vào chỉ chức năng ngày.

Ví dụ bạn đưa ra là (Tôi tin) để lột bỏ sự bán thời gian của DateTime, sau đây không rằng nếu không có chi phí chuyển đổi ...

DATEADD(DAY, DATEDIFF(DAY, 0, <mydate>), 0) 

này cũng nên tránh tràn arithmentic ..

+3

Cách duy nhất để làm điều đó ... – gbn

+0

@gbn Nhưng nó sẽ không làm điều này 'dateiff (ms, '1970-01-01', getdate())'. – Saulius

+0

Cảm ơn @MatBailie đã khắc phục sự cố của tôi! Sử dụng CAST đã cho tôi "lỗi biểu thức chuyển đổi lỗi số học đến datetime dữ liệu" lỗi –

Các vấn đề liên quan