如何显示四舍五入时间

时间:2011-02-06 09:45:10

标签: sql sql-server sql-server-2005 tsql

使用SQL Server 2005

表1

ID Intime Outtime

001 00.21.00 00.48.00
002 08.23.00 13.45.00
003 00.34.00 00.18.00

我需要显示30分钟或1小时的时间,它应该显示一个结束时间

预期产出

ID Intime Outtime

001 00.30.00 01.00.00
002 08.30.00 14.00.00
003 01.00.00 00.30.00

如何查询舍入时间。

3 个答案:

答案 0 :(得分:2)

您可以将当前日期舍入为30分钟,如:

select dateadd(mi, datediff(mi,0,getdate())/30*30, 0)

说明:这需要自0日期以来的分钟数:

datediff(mi,0,getdate())

然后通过除以并乘以30将其舍入为30的倍数:

datediff(mi,0,getdate())/30*30

将结果添加回0日期以查找最后30分钟的阻止

dateadd(mi, datediff(mi,0,getdate())/30*30, 0)

这可以轻松调整60分钟。 :)

答案 1 :(得分:0)

看看DATEDIFF,DATEADD和DATEPART。你应该能够做到你想做的事情。

http://msdn.microsoft.com/en-us/library/ms189794.aspx

http://msdn.microsoft.com/en-us/library/ms186819.aspx

http://msdn.microsoft.com/en-us/library/ms174420.aspx

这是一个循序渐进的例行程序。我相信你可以做一些更短,更高效的事情。如果您使用datetime数据类型而不是字符串,它也会简化很多。

declare @T table (id char(3), intime char(8), outtime char(8))

insert into @T values ('001', '00.21.00', '00.48.00')
insert into @T values ('002', '08.23.00', '13.45.00')
insert into @T values ('003', '00.34.00', '00.18.00')

;with
cteTime(id, intime, outtime)
as
( -- Convert to datetime
  select
    id,
    cast(replace(intime, '.', ':') as datetime),
    cast(replace(outtime, '.', ':') as datetime)
  from @T
),
cteMinute(id, intime, outtime)
as
( -- Get the minute part
   select 
     id,
     datepart(mi, intime),
     datepart(mi, outtime)
   from cteTime  
),
cteMinuteDiff(id, intime, outtime)
as
( -- Calcualte the desired diff
  select
    id,
    case when intime > 30 then (60 - intime) else (30 - intime) end, 
    case when outtime > 30 then (60 - outtime) else (30 - outtime) end 
  from cteMinute
),
cteRoundTime(id, intime, outtime)
as
( -- Get the rounded time
  select
    cteTime.id,
    dateadd(mi, cteMinuteDiff.intime, cteTime.intime),
    dateadd(mi, cteMinuteDiff.outtime, cteTime.outtime)
  from cteMinuteDiff
    inner join cteTime
      on cteMinuteDiff.id = cteTime.id
),
cteRoundedTimeParts(id, inHour, inMinute, outHour, outMinute)
as
( -- Split the time into parts
  select 
    id,
    cast(datepart(hh, intime) as varchar(2)) as inHour,
    cast(datepart(mi, intime) as varchar(2)) as inMinute,
    cast(datepart(hh, outtime) as varchar(2)) as outHour,
    cast(datepart(mi, outtime) as varchar(2)) as outMinute
  from cteRoundTime 
),
cteRoundedTime(id, intime, outtime)
as
( -- Build the time string representation
  select 
    id,
    right('00'+inHour, 2)+'.'+right('00'+inMinute, 2)+'.00',
    right('00'+outHour, 2)+'.'+right('00'+outMinute, 2)+'.00'
  from cteRoundedTimeParts
)
select *
from cteRoundedTime

答案 2 :(得分:0)

检查范围

select ID,
   DateAdd(mi, DateDiff(mi, 0, Intime +
      case when InMi >= 15 then 30 - InMi else - InMi end), 0) as Intime,
   DateAdd(mi, DateDiff(mi, 0, Outtime +
      case when OutMi >= 15 then 30 - OutMi else - OutMi end), 0) as Outtime
FROM
(
select ID, Intime, Outtime,
datepart(mi, InTime) % 30 InMi,
datepart(mi, Outtime) % 30 OutMi
from tbl
) X

或使用等同于Int(x + 0.5)的经典技巧..

select ID,
    dateadd(mi, ((datediff(mi, 0, Intime)+15)/30)*30, 0) Intime,
    dateadd(mi, ((datediff(mi, 0, Outtime)+15)/30)*30, 0) Outtime
from tbl

如果您想改为ROUNDUP

(你的值从00.34.00到01.00.00)然后你需要这个

select ID,
    dateadd(mi, ((datediff(mi, 0, Intime)+29)/30)*30, 0) Intime,
    dateadd(mi, ((datediff(mi, 0, Outtime)+29)/30)*30, 0) Outtime
from tbl