如何将nvarchar值'********'转换为数据类型int

时间:2019-05-16 10:08:13

标签: sql-server

如何将nvarchar值'********'转换为数据类型int

TransactionDate列中有一列,其中一些的值为'********'

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

2 个答案:

答案 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_CASTTRY_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)