Sql 查找字段的len,如果列中的len小于8,则更新字段

Sql 查找字段的len,如果列中的len小于8,则更新字段,sql,sql-server,Sql,Sql Server,我有一个数据类型为varchar的列policy_date Policy_date ----------- A1999062 20010405 我想用 如果isnumericpolicy_date=0,则修剪字母1999062并检查len是否小于8,然后将其设为NULL else Policy_date 注意:我必须将日期字段转换为日期数据类型,而不是varchar。 我的输出应该如下所示: Policy_Date ----------- NULL 2001-04-05 任何人都可以编写sq

我有一个数据类型为varchar的列policy_date

Policy_date
-----------
A1999062
20010405
我想用 如果isnumericpolicy_date=0,则修剪字母1999062并检查len是否小于8,然后将其设为NULL else Policy_date

注意:我必须将日期字段转换为日期数据类型,而不是varchar。 我的输出应该如下所示:

Policy_Date
-----------
NULL
2001-04-05
任何人都可以编写sql case语句。 非常感谢。
Swathi。

根据您的评论,如果第一个字符位置是alpha,您只需要删除它。这样就不需要函数/CLR调用。如果此需求发生变化,您将需要创建一个函数来去除字符,但查询的其余部分将正常工作

Create Table #Test (PolicyDate Varchar(8000))
Insert #Test Values ('A19990602')
Insert #Test Values ('A1999062')
Insert #Test Values ('20010405')

Select  Convert(Date,
        Case When IsNumeric(PolicyDate) = 0 Then 
             Case When Len(PolicyDate) < 9 Then Null
                Else Right(PolicyDate, Len(PolicyDate) -1) End
            Else PolicyDate
            End) PolicyDate2
    From #Test 

另外,我使用的是IsNumeric,因为这是您说过要实现的。但是,请注意,根据设计,可以包含certian字符,并且仍然具有返回数字的函数。IsNumeric$1230.54将返回1。如果这是一个问题,则使用另一个选项,例如,对于sql2012及更高版本,请尝试将PARSEPolicyDate作为int。

根据您的注释,如果第一个字符位置是alpha,则只需删除它。这样就不需要函数/CLR调用。如果此需求发生变化,您将需要创建一个函数来去除字符,但查询的其余部分将正常工作

Create Table #Test (PolicyDate Varchar(8000))
Insert #Test Values ('A19990602')
Insert #Test Values ('A1999062')
Insert #Test Values ('20010405')

Select  Convert(Date,
        Case When IsNumeric(PolicyDate) = 0 Then 
             Case When Len(PolicyDate) < 9 Then Null
                Else Right(PolicyDate, Len(PolicyDate) -1) End
            Else PolicyDate
            End) PolicyDate2
    From #Test 

另外,我使用的是IsNumeric,因为这是您说过要实现的。但是,请注意,根据设计,可以包含certian字符,并且仍然具有返回数字的函数。IsNumeric$1230.54将返回1。如果这是一个问题,那么请使用另一个选项,例如,对于sql2012及更高版本,请尝试将PARSEPolicyDate作为int。

您可以使用最右边的8个字符,在stuff中插入两个连字符,并用isdate检查该日期是否有效。如果是,请重复相同操作,并使用cast进行转换:


您可以使用最右边的8个字符,在其中插入两个连字符,然后用isdate检查该日期是否有效。如果是,请重复相同操作,并使用cast进行转换:


我无法撰写案例陈述,但以下是我尝试过的。。从isnumeric[policy\u date]=0的表中选择RIGHT[policy\u date],LEN[policy\u date]-1作为MyTrimmedColumn,您使用的是哪个版本的SQL Server?自SQL Server 2012以来,已经添加了几个函数TRY_PARSE、TRY_CONVERT和TRY_CAST,这些函数可用于帮助执行此操作。我无法编写case语句,但下面是我尝试的内容。。从isnumeric[policy\u date]=0的表中选择RIGHT[policy\u date],LEN[policy\u date]-1作为MyTrimmedColumn,您使用的是哪个版本的SQL Server?自SQL Server 2012以来,已添加了多个可用于帮助执行此操作的函数TRY_PARSE、TRY_CONVERT和TRY_CAST。请不要使用ISNUMERIC。选择ISNUMERIC$、ISNUMERIC'、ISNUMERIC'、'Joe c-我对您发送的测试查询做了小更改创建表测试策略日期Varchar8000插入测试值'A1999062'插入测试值'A1999062'插入测试值'20010405'选择ConvertDate,IsNumericPolicyDate=0时为案例,LenPolicyDate<9时为案例,Else RightPolicyDate时为案例,LenPolicyDate-1 End Else PolicyDate End PolicyDate End PolicyDate 2 From Test当我在输出中设置nULL时,我得到的日期是1900-01-01,我希望如此。有什么建议吗?如果类型是字符varchar nvarchar char等,则只能得到空字符串。如果是date,则将获得默认值1900-01-01请不要使用ISNUMERIC。选择ISNUMERIC$、ISNUMERIC'、ISNUMERIC'、'Joe c-我对您发送的测试查询做了小更改创建表测试策略日期Varchar8000插入测试值'A1999062'插入测试值'A1999062'插入测试值'20010405'选择ConvertDate,IsNumericPolicyDate=0时为案例,LenPolicyDate<9时为案例,Else RightPolicyDate时为案例,LenPolicyDate-1 End Else PolicyDate End PolicyDate End PolicyDate 2 From Test当我在输出中设置nULL时,我得到的日期是1900-01-01,我希望是这样。有什么建议吗?如果类型是字符varchar nvarchar char等,则只能得到一个空字符串。如果是date,则将得到默认值1900-01-01
select case when len(policy_date) >= 8 
                 and isdate(stuff(stuff(right(policy_date, 8), 7, '-'), 5, '-')) then
            cast(stuff(stuff(right(policy_date, 8), 7, '-'), 5, '-') as datetime)
       end