将VARCHAR 24小时时间转换为12小时

时间:2019-11-14 14:41:19

标签: sql sql-server time format

我有一个24小时的时间start_time,它存储为varchar(对此无法控制)。我需要使用AM / PM将其转换为12小时。

示例:

  • 17:45应该成为5:45 PM
  • 09:00应该成为9:00 AM

4 个答案:

答案 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);

DB<>Fiddle

答案 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) 格式说明符不适用于时间数据类型。

相关问题