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

Sql 将VARCHAR 24小时时间转换为12小时,sql,sql-server,time,format,Sql,Sql Server,Time,Format,我有一个24小时的时间,start\u time,它存储为varchar(对此没有控制权)。我需要将其转换为上午/下午12小时 示例: 17:45应该变成5:45 PM 09:00应改为9:00 AM 进行多重对话: select convert(varchar(20), convert(time(0), start_time), 100) from table t; 编辑: 使用应用: select stuff(time_c, len(time_c)-1, 0, ' ') from tab

我有一个24小时的时间,
start\u time
,它存储为
varchar
(对此没有控制权)。我需要将其转换为上午/下午12小时

示例:

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

进行多重对话:

select convert(varchar(20), convert(time(0), start_time), 100)
from table t;
编辑:

使用
应用

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)

你真的应该修改你的设计,我强烈建议你这样做。
time
数据类型的存在是有原因的,值的格式应该在表示层而不是在RDBMS中确定。如果必须转换为较低格式的RDBMS,则需要
转换为
时间
,然后返回到
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);

在时间和AM/PM之间留有空格:

select replace(replace(convert(varchar(8), convert(time(0), '09:00'), 100),'A',' A'),'P',' P')

使用
格式
功能很容易:

选择timestr
,格式(转换(DATETIME,timestr,108),'h:mm t')
,格式(转换(DATETIME,timestr,108),'h:mm tt')
来自(价值观)
('17:45'),
('09:00')
)t(timestr)

请注意,
tt
格式说明符不适用于时间数据类型。

为什么要将时间存储为
varchar
time
数据类型存在的原因是什么?你说你没有控制权,但有人有控制权。不是我那样储存的。相信我,如果我有选择的话,那就不会了。这是我们的PMS系统(酒店),来自第三方公司,他们不会改变它。为什么是12小时?如果您使用的是
varchar
hh:mm
要比
h:mm AM/PM
好得多。除非您希望
'12:00 AM'
'11:59 PM'
之后,否则它是导入到另一个第三方程序所需的格式。如何在时间和AM/PM之间添加空格?目前它给出的是
5:45PM
而不是
5:45PM
。正如在OP评论中所讨论的,这不是我的设计。不幸的是,我对所使用的数据类型没有发言权。我百分之百同意你说的话,我希望我有这个选择来解决它。这就是为什么我仍然继续提供一个答案,@WolfieeifloW,但不使用正确的数据类型是如此重要。尽管你不能,但这并不意味着未来的读者不应该被提醒好的数据选择的重要性;这包括谁设计了您的系统,谁认为varchar在一段时间内是正确的选择我总是非常小心使用
格式
。虽然它是一个非常容易获取格式的“伟大”功能,但它始终是一个伟大的性能杀手。