Ошибка при сравнении даты на SQL сервере - PullRequest
0 голосов
/ 02 апреля 2020

Я хочу сравнить поле DateTime с вводом

Declare @Where varchar(MAX)

set @Where = @Where + 'EndDate >= ''' + cast('01-01-1970' as datetime) + ''' and EndDate <= ''' + cast('01-01-2200' as datetime) + ''''
print @Where

Когда я выполняю этот запрос, я получаю ошибку

Ошибка преобразования при преобразовании даты и / или времени из строки символов .

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Основная проблема заключается в том, что вы пытаетесь объединить строковые данные с данными даты и времени. Предположительно, вы хотите создать строку

EndDate >= '01-01-1970' and EndDate <= '01-01-2200'

В вашем текущем утверждении у вас есть

+ cast('01-01-1970' as datetime)
+ cast('01-01-2200' as datetime) 

. Это займет дату в виде строки и преобразует ее в тип данных datetime - который, внутренне - это 8-байтовое двоичное значение. Затем вы пытаетесь объединить это со строкой, и SQL не может этого сделать. Чтобы это исправить, начните с вашей строки:

set @Where = 'EndDate >= ''' + cast('01-01-1970' as datetime) + ''' and EndDate <= ''' + cast('01-01-2200' as datetime) + ''''

удалите ненужные операторы приведения:

set @Where = 'EndDate >= ''' + '01-01-1970'+ ''' and EndDate <= ''' + '01-01-2200' + ''''

, которые могут быть дополнительно упрощены до:

set @Where = 'EndDate >= ''01-01-1970'' and EndDate <= ''01-01-2200'''

One с другой стороны, у вас есть

Declare @Where varchar(MAX)

Set @Where = @Where + <etc>

@ Где инициализируется как NULL, и когда вы конкатенируете (добавляете) в него сконфигурированную строку, результатом также будет NULL. Я предполагаю, что вы добавляете предложение в существующий оператор WHERE; так как это «новое» предложение, я бы порекомендовал добавить здесь соответствующий логический оператор, например,

Set @Where = @Where + ' AND ' + <etc>
1 голос
/ 02 апреля 2020

Это должно быть. Вы не можете объединить строку с датой и временем.

Возможно, попробуйте это.

Declare @Where varchar(MAX)

set @Where = @Where + 'EndDate >= ''' + cast(cast('01-01-1970' as datetime) as varchar) + ''' and EndDate <= ''' + cast(cast('01-01-2200' as datetime) as varchar) + ''''
print @Where

PS. Вы добавляете переменную @Where, которая не используется (что означает, что значение @Where равно NULL), к постоянным значениям. И результат добавления NULL с чем-то еще - NULL. может быть попробовать это

Declare @Where varchar(MAX)

set @Where =  'EndDate >= ''' + cast(cast('01-01-1970' as datetime) as varchar) + ''' and EndDate <= ''' + cast(cast('01-01-2200' as datetime) as varchar) + ''''
print @Where
...