如何在SQL Server中将varchar / numeric转换为Time

时间:2016-07-21 18:53:26

标签: sql-server tsql

我有一个带有时间字段的表作为数据类型数字(6,0),它显示24小时格式,如100,150300,21000等。

这里100-> 00:01:00(上午12:01) 我写了这样的东西来存储为varchar以便在之前丢失0:

select
Right('000000'+ cast(FM_TIME as varchar(6)),6) FT_Time
from table;

现在如何将此字段转换为时间以使用AM或PM以12小时格式显示。

我们可以通过添加前导0来直接从数字转换为时间吗?

2 个答案:

答案 0 :(得分:1)

如果可能的话,您应该将该列更新为时间数据类型而不是数字(6,0)。

这适用于您提供的示例数据。但请注意,您的表中可能有一些无效的值。

create table #Something
(
    FM_TIME numeric(6,0)
)

insert #Something
select 100 union all
select 150300 union all
select 21000 

select convert(varchar(15), convert(time, STUFF(STUFF(right(REPLICATE('0', 6) + CONVERT(varchar(6), FM_TIME), 6), 3, 0, ':'), 6, 0, ':')), 100)
from #Something

drop table #Something

答案 1 :(得分:0)

如果将此数据转换为SQL Server time数据类型,则可以根据需要(在客户端中)显示该数据。

(应尽可能将数据类型的格式推送到客户端:客户端往往会更好!)

这是一个可以将6位数转换为time值的表达式:

declare @timeNumber int = 235945
select   convert(time, 
            convert(varchar(2), @timeNumber / 10000) + 
            ':' +
            convert(varchar(2), (@timeNumber % 10000) / 100) + 
            ':' +
            convert(varchar(2), @timeNumber % 100)          
        )  

这将返回以下内容:

 23:59:45.0000000

然后您可以根据需要对其进行格式化。

编辑添加:按请求,将上述表达式作为表中的查询添加:

假设字段名称FM_TIME和表名MyTable(因为您没有在示例中提供表名),并且您希望返回的列具有名称{ {1}}:

FT_TIME