我有一个{ 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,
注意:
以上只是测试数据的创建。有必要应用一些只输入有效时间的地方
答案 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;