2009-03-11 30 views
6

Bu select ifadesi bana aritmetik hata mesajı verir: bu seferki çalışsa daAritmetik taşma hatası

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

:

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

(verilerle yanlış bir şey olabilir Boş değerler için kontrol ettim ve hiç yok)?

cevap

9

Sorun, bir tarihin 9999-12-31 olarak ayarlandığında, büyük olasılıkla işlemek için ondalık büyüklükte olduğu zaman bulundu. Ondalıktan yüzmeye değişti ve her şey bir çekicilik gibi çalışıyor.

7

Genel olarak, bir tarih veya sayı dizgesine dönüştürme, tarih işlemlerini gerçekleştirme konusunda son derece verimsizdir. (Dönüşümler, dizge manipülasyonları gibi nispeten yoğundur.) Sadece tarih fonksiyonlarına bağlı kalmak daha iyidir.

Verdiğiniz örnek ... dönüşümlerin yükü olmadan bunu yapmaz aşağıdaki

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

Bu aynı zamanda arithmentic taşmaları kaçınmalısınız, DateTime zaman parçası uzaklıkta şerit (sanırım) 'dir ..

+3

Bunu yapmanın tek yolu ... – gbn

+0

@gbn Fakat bunu yapmayacaksınız 'datediff (ms,' 1970-01-01 ', getdate()) '. – Saulius

+0

Teşekkürler @MatBailie bu sorunu çözdü! CAST kullanarak bana "veri tipine veriyi datetime dönüştürerek aritmetik taşma hatası" hatası veriyordu –