Почему я получаю сообщение об ошибке «Тип операнда clash: дата несовместима с int», когда я использую переменную типа даты вместо жестко закодированной даты? - PullRequest
0 голосов
/ 23 февраля 2019

Я немного сбит с толку относительно того, почему я получаю сообщение об ошибке «Тип операнда: несовместимость даты с int», когда я использую переменную даты вместо жестко заданной даты в условии, упомянутом для цикла WHILE.

Declare @ddate date='2013-03-25', @MembershipDate date= '2013-03-27',@id int=0
while (@ddate<=DATEADD(mm,3,@MembershipDate)-1) 
begin
set @id=@id+1
end

Но если я использую жестко закодированную дату, как указано ниже, я не получу никакой ошибки

Declare @ddate date='2013-03-25',@id int=0
while (@ddate<=DATEADD(mm,3,'2013-03-27')-1) 
begin
set @id=@id+1
end

Пожалуйста, дайте мне знать причину.

1 Ответ

0 голосов
/ 23 февраля 2019

Поскольку при использовании строки она неявно приводится к datetime, а результатом DATEADD является datetime.

Когда вы используете дату, результатом DATEADD является date.

это указано в документах

DATEADD (datepart , number , date )

Тип данных аргумента date становится типом данных возвращаемого значения DATEADD, за исключением строкового литералазначения даты.Для строкового литерала DATEADD возвращает значение datetime.

Более новые типы данных даты и времени не поддерживают этот тип арифметики.Вы можете использовать DATEADD с day и -1, чтобы вычесть из них день.В любом случае, это понятнее.

...