验证varchar数据类型值以格式化HH:MM

时间:2017-01-05 14:22:49

标签: sql sql-server sql-server-2014

我有一个{ Dimension: "1", Sum: 20.97 } { Dimension: "14", Sum: 121.57} 列,数据类型为test_mac

例如,该列中将包含以下值:

varchar

我目前正在这样做:

create table test_mac
(
     time_in varchar(200)
)

insert into test_mac values ('23:15')
insert into test_mac values ('23:1')
insert into test_mac values ('23:12')
insert into test_mac values ('sdfdsfs')
insert into test_mac values ('23/15')
insert into test_mac values ('2315')
insert into test_mac values ('2:15')
insert into test_mac values ('23:')

我要求的预期结果是:

select * 
from test_mac   
where time_in LIKE '%[0-2][0-9]:[0-5][0-59]'
   and ISDATE(time_in) = 1

应该是有效时间。如果有值为23:1,我必须将它们更新为23:10或2:15至02:15,

注意

以上只是测试数据的创建。有必要应用一些只输入有效时间的地方

2 个答案:

答案 0 :(得分:2)

您可以使用frontend data showing date Null执行此操作。无效值将显示为null

select time_in,try_convert(time,time_in) 
from test_mac

修改:要处理其中没有:字符的值,您可以使用case表达式。

select time_in,
case when charindex(':',time_in) = 0 then null else try_convert(time,time_in) end
from test_max

此外,23:1应转换为23:10的假设是错误的。假设您的值为23:6,则应将其转换为23:06而不是23:60

答案 1 :(得分:2)

如果一个漂亮的解决方案不是你想要的,这是一个稍微冗长的hacky解决方案,我写的很快就完成了这项工作,它经过了轻微的测试,可用于你的样本数据:

CREATE TABLE #test_mac
    (
      time_in VARCHAR(200) ,
      formatted VARCHAR(10)
    );

INSERT  INTO #test_mac
VALUES  ( '23:15', NULL ),
        ( '23:1', NULL ),
        ( '23:12', NULL ),
        ( 'sdfdsfs', NULL ),
        ( '23/15', NULL ),
        ( '2315', NULL ),
        ( '2:15', NULL ),
        ( '23:', NULL );


UPDATE  #test_mac
SET     formatted = CASE WHEN LEN(SUBSTRING(time_in, 0,
                                            CHARINDEX(':', time_in))) = 2
                         THEN SUBSTRING(time_in, 0, CHARINDEX(':', time_in))
                         ELSE '0' + SUBSTRING(time_in, 0,
                                              CHARINDEX(':', time_in))
                    END + ':'
        + CASE WHEN LEN(SUBSTRING(time_in, CHARINDEX(':', time_in) + 1, 2)) = 2
               THEN SUBSTRING(time_in, CHARINDEX(':', time_in) + 1, 2)
               ELSE SUBSTRING(time_in, CHARINDEX(':', time_in) + 1, 1) + '0'
          END
WHERE   time_in LIKE '%[0-9]:[0-5]%' -- looks for a single digit before & after
        AND LEN(time_in) <= 5; -- length must be 5 characters or less

SELECT  *
FROM    #test_mac
WHERE   formatted IS NOT NULL;

DROP TABLE #test_mac;