Добавление значения в столбец datetime вызвало переполнение

Я перекрестно применил табличную функцию в операторе DML, который возвращает два столбца, один из которых — RiskValue (который представляет собой целое число, обозначающее период сканирования). Теперь, когда я печатаю значение RiskValue вместе с функцией dateadd, подобной этой (y — это псевдоним функции, а am это другая таблица)

select cast(y.RiskValue as int),dateadd(m,cast(y.RiskValue as int),@RunningDate)
from .....

это дает мне правильные значения, как

6    |    'Some Date'

но когда я использую его в предложении where как

where am.DateOpen >= dateadd(m,cast(y.RiskValue as int),@RunningDate)

Я получаю сообщение об ошибке:

Добавление значения в столбец datetime вызвало переполнение

Обратите внимание, что передача жестко закодированных значений как

where am.DateOpen >= dateadd(m,6,@RunningDate) 

работает отлично. (очевидно будет)

Любые предложения, что может быть не так?


person Codeek    schedule 16.05.2015    source источник
comment
Каковы значения @RunningDate и RiskValue? Тип date переполняется после добавления чего-то, что выталкивает его за пределы максимального 9999-12-31, поэтому ваше значение риска должно быть более 95000 или около того, если дата запуска приходится на 2015 год. Может ли это быть? Кроме того, какой тип имеет RunningValue?   -  person jpw    schedule 16.05.2015
comment
Сорри за задержку с ответом. Значение @RunningDate находится в диапазоне от 2015-05-10 до 2015-05-16. RiskValue равен 6, текущее значение имеет тип DateTime.   -  person Codeek    schedule 16.05.2015
comment
Я не могу воссоздать эту ошибку с учетом этих значений, и это не должно произойти. Вы абсолютно уверены, что в столбце RiskValue нет большого значения?   -  person jpw    schedule 16.05.2015
comment
что я. Я напечатал значения, используя Select без предложения where, это работает. В тот момент, когда я ввожу предложение where, это не так. Единственное значение RiskValue, которое может содержаться на данный момент, равно 6.   -  person Codeek    schedule 16.05.2015
comment
Тогда у меня нет идей. Если выбор работает, то и где тоже должно быть.   -  person jpw    schedule 16.05.2015
comment
RiskValue равен 6 для этой строки, но вы должны понимать, что SQL Server может не оптимизировать оператор в том же порядке, в котором вы его написали. Часто может произойти ошибка при попытке выполнить вычисления со значениями, которые должны были быть исключены фильтром, но вычисления были предприняты сначала. См. этот элемент Connect и этот ответ. Вы можете попробовать DATEADD(MONTH, CASE WHEN y.RiskValue < 20000 THEN y.RiskValue END, @RunningDate).   -  person Aaron Bertrand    schedule 16.05.2015
comment
Также см. этот ответ и это сообщение в блоге.   -  person Aaron Bertrand    schedule 16.05.2015
comment
Это решает. Большое спасибо, сэр. Вы должны были поместить это в ответ, чтобы я мог пометить это как ответ   -  person Codeek    schedule 18.05.2015


Ответы (1)


Размещение комментария Аарона Бертрана в качестве ответа, чтобы люди, достигшие этого вопроса, сочли его полезным:

RiskValue равен 6 для этой строки, но вы должны понимать, что SQL Server может не оптимизировать оператор в том же порядке, в котором вы его написали. Часто может произойти ошибка при попытке выполнить вычисления со значениями, которые должны были быть исключены фильтром, но вычисления были предприняты первыми. Мы можем попробовать

DATEADD(MONTH, CASE WHEN y.RiskValue < 20000 THEN y.RiskValue END, @RunningDate)

Также прочитайте это и это для лучшего понимания

person Codeek    schedule 10.01.2021