2009-03-11 4 views
6

Этот оператор выбора дает мне сообщение арифметической ошибке:Ошибка арифметического переполнения при преобразовании выражения для данных типа DateTime

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' 

Может ли быть что-то неправильно с данными (Я проверил нулевые значения, и их нет)?

ответ

9

Обнаружена проблема, когда дата была установлена ​​в 9999-12-31, возможно, большой для десятичной обработки. Изменено от десятичного до плавающего, и все работает как шарм.

7

В общем, преобразование даты в числовой или строковый, для выполнения операций с ней на данный момент, крайне неэффективно. (Конверсии относительно интенсивны, как и строковые манипуляции). Гораздо лучше придерживаться только функций даты.

примера вы даете (я верю), чтобы стирает время части DateTime, следующий делает это без накладных преобразований ...

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

Это также следует избегать arithmentic переполнения ..

+3

Единственный способ сделать это ... – gbn

+0

@gbn Но он не будет делать это 'lateiff (ms, '1970-01-01', getdate())'. – Saulius

+0

Спасибо @MatBailie, это исправило мою проблему! Использование CAST дало мне ошибку «Ошибка арифметического переполнения ошибки преобразования в тип данных datetime» –

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

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