Как преобразовать значение nvarchar '********' в тип данных int - PullRequest
0 голосов
/ 16 мая 2019

Как мне преобразовать nvarchar значение '********' в тип данных int?

Столбец TransactionDate есть столбец, некоторые из которых имеют значение '********'

select 
    PolicyNumber
    ,PlanType
    ,Premium
    ,TransactionDate
    ,PostDate 
from 
    EasyCover 
where 
    transactionDate >= 20170101

Ответы [ 2 ]

1 голос
/ 16 мая 2019

Даже если в ваших данных не было строк, в которых 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 |
+-------------------------+
0 голосов
/ 16 мая 2019

Вы не можете конвертировать ******** в int, потому что это не число.Вы можете использовать try_cast, try_convert и т. Д., Чтобы избежать ошибки, которую вы упомянули, но вы получите NULL вместо ********.

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