Как отобразить время - PullRequest
       2

Как отобразить время

2 голосов
/ 06 февраля 2011

Использование SQL Server 2005

Table1

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 ]

2 голосов
/ 06 февраля 2011

Вы можете округлить текущую дату до 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 минут. :)

0 голосов
/ 06 февраля 2011

Проверяя диапазон

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
0 голосов
/ 06 февраля 2011

Посмотрите на 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...