我有一个数据库,显示时间为整数。但是,我想将其输出到具有正确格式的报告中。这是我想要改变的格式:
例如。
183000将成为18:30 500将成为00:05 160000将成为16:00
等等。
我看过CAST和CONVERT,但没有成功设法以正确的格式获得这个时间。
答案 0 :(得分:3)
看起来你需要除以100得到秒,除以10000得到分钟,除以1000000得到小时,然后将这些值格式化为字符串,在小时和分钟之间插入冒号,如
HH:MM
答案 1 :(得分:3)
假设您的输入始终为int,您可以使用以下内容进行解析:
DECLARE @stringTime varchar(6)
SET @stringTime = RIGHT('000000' + CAST(intTime AS VARCHAR), 6)
SELECT CAST(LEFT(@stringTime, 2) + ':' + RIGHT(LEFT(@stringTime, 4), 2) AS TIME) as TimeValue
我绝对希望将此字段更改为实际时间或日期时间字段,因为不建议使用此级别的转换,尤其是对于使用频繁的数据库。确实有一种更好的存储数据的方法。
使用int值这种方式允许大量不良数据,而不会在输入上添加大量额外的检查和/或约束(即:260000,127900等)
答案 2 :(得分:2)
首先转换为varchar字段并将所有时间转换为4位数,如果需要则添加前导零(500将变为0500),然后使用concantenation分离字段Left(myfield,2)+':'+ right(myfield) ,2)
每次运行报表时这都是愚蠢的事情,浪费了服务器资源。如果可能,将字段更改为varchar并将代码更改为一次。如果不可能,你可以添加一个格式化的字段并在触发时进行格式化(你还需要第一次更新字段吗?可能是一个约束而不是一个触发器,但这取决于数据库
答案 3 :(得分:1)
我假设您使用CONVERT
和以前的问题在SQL Server上。
您也可以使用DATEADD
。
WITH Times AS
(
SELECT 183000 AS T
UNION ALL
SELECT 500
UNION ALL
SELECT 160000
)
SELECT CAST(DATEADD(SECOND, T%100 + (60*(T%10000 / 100)) + 3600*(T/10000),0)
AS time /*Or datetime if < SQL Server 2008*/)
FROM Times
答案 4 :(得分:0)
declare @i int = 235959
select cast(stuff(stuff(
case when len(cast(@i as varchar(6))) = 6 then cast(@i as varchar(6))
else REPLICATE('0',6 - LEN(cast(@i as varchar(6))))+cast(@i as varchar(6))
end
,3,0,':'), 6, 0,':') as datetime)
set @i = 500
select cast(stuff(stuff(
case when len(cast(@i as varchar(6))) = 6 then cast(@i as varchar(6))
else REPLICATE('0',6 - LEN(cast(@i as varchar(6))))+cast(@i as varchar(6))
end
,3,0,':'), 6, 0,':') as datetime)
答案 5 :(得分:0)
DECLARE @intTime int
SET @intTime = 50000
SELECT CAST(STUFF(STUFF(CONCAT(REPLICATE('0', 6 - LEN(@intTime)),@intTime),3,0,':'),6,0,':') AS TIME(0))