如何将nvarchar
值'********'转换为数据类型int
?
第TransactionDate
列中有一列,其中一些的值为'********'
select
PolicyNumber
,PlanType
,Premium
,TransactionDate
,PostDate
from
EasyCover
where
transactionDate >= 20170101
答案 0 :(得分:1)
即使您的数据中没有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级状态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 |
+-------------------------+
答案 1 :(得分:0)
您不能将'********'转换为int,因为它不是数字。您可以使用try_cast,try_convert等来避免您提到的错误,但是您将获得NULL而不是'********'。
TRY_CAST(TransactionDate as int)