我有一个列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:15
23:1
23:12
2:15 应该是有效时间。如果值为23:1,我必须将它们更新到23:10或2:15至02:15,
注意事项
上面只是一个测试的创建,data.Have应用了一些地方,只是输入了有效时间。
发布于 2017-01-05 15:06:57
如果一个漂亮的解决方案不是您想要的,下面是我为完成这项工作而快速编写的一个稍长的、令人费解的解决方案,该解决方案经过了轻微的测试,并适用于您的示例数据:
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;发布于 2017-01-05 14:32:23
您可以使用try_convert来完成此操作。无效值将显示为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。
https://stackoverflow.com/questions/41487422
复制相似问题