首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >验证varchar数据类型值以格式化HH:MM

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

Stack Overflow用户
提问于 2017-01-05 14:22:48
回答 2查看 320关注 0票数 1

我有一个列test_mac,其数据类型为varchar

例如,该栏中将有以下值:

代码语言:javascript
复制
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:')

我目前正在这样做:

代码语言:javascript
复制
select * 
from test_mac   
where time_in LIKE '%[0-2][0-9]:[0-5][0-59]'
   and ISDATE(time_in) = 1

我所要求的预期结果是:

代码语言:javascript
复制
23:15 
23:1 
23:12 
 2:15 

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

注意事项

上面只是一个测试的创建,data.Have应用了一些地方,只是输入了有效时间。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-05 15:06:57

如果一个漂亮的解决方案不是您想要的,下面是我为完成这项工作而快速编写的一个稍长的、令人费解的解决方案,该解决方案经过了轻微的测试,并适用于您的示例数据:

代码语言:javascript
复制
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;
票数 2
EN

Stack Overflow用户

发布于 2017-01-05 14:32:23

您可以使用try_convert来完成此操作。无效值将显示为null

代码语言:javascript
复制
select time_in,try_convert(time,time_in) 
from test_mac

编辑:要处理没有:字符的值,可以使用case表达式。

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41487422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档