我有一个24小时的时间start_time
,它存储为varchar
(对此无法控制)。我需要使用AM / PM将其转换为12小时。
示例:
17:45
应该成为5:45 PM
09:00
应该成为9:00 AM
答案 0 :(得分:2)
进行多次对话:
select convert(varchar(20), convert(time(0), start_time), 100)
from table t;
编辑:
使用apply
:
select stuff(time_c, len(time_c)-1, 0, ' ')
from table t cross apply
( values (convert(varchar(20), convert(time(0), start_time), 100))
) t(time_c)
答案 1 :(得分:2)
时间与AM / PM之间有一个空格:
select replace(replace(convert(varchar(8), convert(time(0), '09:00'), 100),'A',' A'),'P',' P')
答案 2 :(得分:1)
您确实应该修复您的设计,我强烈建议您这样做。 time
数据类型的存在是有原因的,该值的格式应在表示层而不是RDBMS中确定。如果您必须以较低的格式转换为RDBMS,则需要将CONVERT
转换为time
,然后返回varchar
并使用一些字符串操作:
SELECT V.YourTime,
STUFF(NewTime, LEN(NewTime)-4,3,' ') AS NewTime
FROM (VALUES('09:00'),('17:45'))V(YourTime)
CROSS APPLY(VALUES(CONVERT(varchar(10),CONVERT(time(0),V.YourTime),109)))C(NewTime);
答案 3 :(得分:1)
使用function transform(obj, fn) {
function transformer(obj) {
if (!obj || typeof obj !== 'object')
return obj;
if (Array.isArray(obj))
return obj.map((v, k) => fn(v, k, transformer));
return Object.fromEntries(
Object.entries(obj).map(([k, v]) => [k, fn(v, k, transformer)]));
}
return transformer(obj)
}
//
const objectOld = {
level1: {
level2: {
level3: {
code: 123,
error: 'Message'
}
}
},
otherKey: { anotherOne: { code: 25, error: 'Message2'}}
}
let newObj = transform(objectOld, (val, key, trans) =>
('error' in val) ? {error: val} : trans(val)
)
console.log(newObj)
函数很容易:
FORMAT
请注意,SELECT timestr
, FORMAT(CONVERT(DATETIME, timestr, 108), 'h:mm t')
, FORMAT(CONVERT(DATETIME, timestr, 108), 'h:mm tt')
FROM (VALUES
('17:45'),
('09:00')
) t(timestr)
格式说明符不适用于时间数据类型。