Даже если в ваших данных не было строк, в которых TransactionDate
имел значение **********
, ваш запрос в том виде, в котором он написан, все равно выдавал бы ошибку.
Рассмотрите этот запрос:
declare @t table
(
NotADate nvarchar(50)
);
insert @t
values (N'2018-01-01 14:30:00.000'),(N'2019-01-01 13:30:00.000');
select *
from @t
where NotADate > 20170101
Сообщение 245, Уровень 16, Состояние 1, Строка 4 Преобразование не удалось при преобразовании значения nvarchar '2018-01-01 14: 30: 00.000' в тип данных int.
В вашей таблице нет актуальных значений даты.У вас есть строки.Функции даты не будут работать, или, что еще хуже, будут работать, но будут давать неожиданные, возможно, неправильные результаты.Кроме того, в вашем предложении WHERE
вы используете целочисленное значение 20170101
.Это число, а не дата.
Чтобы выполнить то, что вы хотите, сначала вы должны указать SQL Server обрабатывать строковое поле TransactionDate
, как если бы оно было полем даты, по крайней мере, так часто, как это возможно, то есть игнорируя эти значения звездочки.Вы достигнете этого с помощью TRY_PARSE
(или TRY_CAST
или TRY_CONVERT
, если хотите).
Затем вы захотите указать движку сделать неявное преобразование для вашего предложения WHERE
, чего вы можете достичь, просто заключив предикат в одинарные кавычки.
Используя то же самоенастройте, как указано выше, но со звездочкой на этот раз, вот как должна выглядеть ваша WHERE
фраза, и она работает:
declare @t table
(
NotADate nvarchar(50)
);
insert @t
values (N'*****************'),(N'2019-01-01 13:30:00.000');
select *
from @t
where TRY_PARSE(NotADate AS datetime USING 'en-US') > '20170101'
Результаты:
+-------------------------+
| NotADate |
+-------------------------+
| 2019-01-01 13:30:00.000 |
+-------------------------+