2016-07-28 39 views
0

我有数据类型VARCHAR列policy_date更新字段发现场的LEN,如果len为小于8列

Policy_date 
----------- 
A1999062 
20010405 

我想ISNUMERIC时 情况来更新数据(policy_date)= 0,然后修改字母表(1999062)并检查len是否小于8,然后将其设置为NULL其他Policy_date。

注:我必须将日期字段转换为date数据类型而不是varchar。 我放出来应该是这样的:

Policy_Date 
----------- 
NULL 
2001-04-05 

任何人都可以编写SQL case语句。 谢谢, Swathi。

+0

我无法写case语句,但这里是我试过.. 选择RIGHT([policy_date],LEN([policy_date]) - 1)AS MyTrimmedColumn 从表 其中isnumeric([policy_date])= 0 – swathi

+2

您正在使用哪个版本的SQL Server?自SQL Server 2012(TRY_PARSE,TRY_CONVERT和TRY_CAST)以来,已经添加了几个函数可用于帮助解决此问题。 –

回答

2

根据你的评论,你只是想删除第一个字符的位置,如果它是阿尔法。这消除了对函数/ 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 

示例功能,有很多可用的方法,哪种方法更快。

CREATE Function [fnRemoveNonNumericCharacters](@strText VARCHAR(1000)) 
RETURNS VARCHAR(1000) 
AS 
BEGIN 
    WHILE PATINDEX('%[^0-9]%', @strText) > 0 
    BEGIN 
     SET @strText = STUFF(@strText, PATINDEX('%[^0-9]%', @strText), 1, '') 
    END 
    RETURN @strText 
END 

ps。我使用了IsNumeric(),因为这就是你说的你想实现的。但是请注意,通过设计,可以包含certian字符,并且仍然有函数返回它是一个数字。 IsNumeric($1,230.54)将返回1.如果这是一个问题,则使用替代方法,例如TRY_PARSE(PolicyDate as int)用于sql2012及更高版本。

+1

请不要使用ISNUMERIC()。 SELECT ISNUMERIC($),ISNUMERIC('。'),ISNUMERIC(',') – dfundako

+0

谢谢Joe c – swathi

+0

Joe c - 我对发送的#Test查询做了小改动 创建表#Test(PolicyDate Varchar(8000 )) 插入#TEST VALUES( 'A19990602') 插入#TEST VALUES( 'A1999062') 插入#TEST VALUES( '20010405') 选择Convert(日期, 案例时则IsNumeric(PolicyDate)= 0,则 如果Len(PolicyDate)<9 Then'' Else Right(PolicyDate,Len(PolicyDate)-1)End Else PolicyDate End)PolicyDate2 From #Test When i make nULL to ''然后在输出我得到的日期为1900-01-01,我希望这是''。任何建议? – swathi

0

您可以取最右边的8个字符,用stuff()注入两个连字符,然后检查这是否与isdate()有效。如果是这样,重复相同,使转化率随cast()

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