Sql 将VARCHAR 24小时时间转换为12小时
我有一个24小时的时间,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
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在一段时间内是正确的选择我总是非常小心使用格式
。虽然它是一个非常容易获取格式的“伟大”功能,但它始终是一个伟大的性能杀手。