Ошибка арифметического переполнения при преобразовании выражения в тип данных datetime - PullRequest
6 голосов
/ 11 марта 2009

Это оператор выбора дает мне арифметическое сообщение об ошибке:

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'

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

Ответы [ 3 ]

9 голосов
/ 11 марта 2009

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

8 голосов
/ 11 марта 2009

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

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

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

Также следует избегать арифметических переполнений ...

0 голосов
/ 05 марта 2019

Может быть, это кому-то поможет, так как моя проблема была немного другой.

SELECT, который выдавал эту ошибку, имел много вложенных SELECT и много сравнений дат с арифметическими операциями, такими как GETDATE() - CloseDate.

Результат таких операций сравнивался с '1900-01-01', который многократно упоминался во вложенных SELECT.

Мое решение состояло в том, чтобы объявить переменные для результата GETDATE() и datetime для переменной '1900-01-01', чтобы избежать преобразований.

Declare @CurrentDate datetime = GetDate()
Declare @BlankDate datetime = '1900-01-01'
...
... @CurrentDate - CloseDate ...
... CloseDate <> @BlankDate ...

Бит DATEADD(DAY, DATEDIFF(DAY, 0, <mydate>), 0) из ответа MatBailie также был полезен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...