Время раунда до точного часа SQL Server - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть этот запрос SQL:

select  
    e.Cedula, 
    concat (e.Nombre, ' ', e.Apellido) nombre, 
    C.Descripcion cargo,
    max(case when mo.Sentido = 'Entrada' then cast(mo.FechaHora as time)
    end) as Entrada,
    max(case when mo.Sentido = 'Salida' then cast(mo.FechaHora as time)
    end) as Salida,
    e.Direccion observaciones 
from 
    mambo.dbo.EMPLEADO e
left join 
    mambo.dbo.CARGO c on e.IdCargo = c.IdCargo
left join 
    mambo.dbo.MARCACIONES_PARA_LIQUIDACION mo on e.IdEmpleado = mo.IdEmpleado 
                                              and CAST(mo.FechaHora AS DATE) = '2018-04-25'
where 
    e.IdCentroCosto = 14 
    and e.estado = '1' 
group by 
    e.IdEmpleado, e.Cedula, e.Nombre, e.Apellido, c.Descripcion, e.Direccion

Что возвращает этот результат:

Результат выбора

Можно ли как-нибудь округлить время до ближайшего точного часа в диапазоне 15 минут?

Пример:

  • если это 6:45, я хочу, чтобы результат показывал 7: 00
  • если это 6:58, я хочу, чтобы результат показывал 7: 00
  • если это 17:15 Я хочу, чтобы результат показывал 17: 00
  • , если это 17:01 Я хочу, чтобы результат показывал 17: 00

Любая помощь будет очень ценится

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Вы можете превратить это в функцию, некоторые из них можно упростить / убрать, чтобы показать шаги / ясность.

DECLARE @TimeCheck AS VARCHAR(50)

SET @TimeCheck = '17:30'

DECLARE @HourOfTime AS INT
DECLARE @MinuteOfTime AS INT

SET @MinuteOfTime = RIGHT(@TimeCheck, 2)
SET @HourOfTime = LEFT(@TimeCheck, 2)

SELECT @HourOfTime, @MinuteOfTime

-- here if the minutes between 0 and 20 then dont add anything, if it is 30 and 59 add 1 to the hours.
-- if you need more options or need to change the logic you can add more WHEN statements or change the numbers for the between
SET @HourOfTime += CASE 
    WHEN @MinuteOfTime BETWEEN 0 AND 29 THEN 0
    WHEN @MinuteOfTime BETWEEN 30 AND 59 THEN 1
END

SELECT CAST(@HourOfTime AS VARCHAR(30)) + ':00'  -- since rounding this will just be hard coded to 00
0 голосов
/ 27 апреля 2018

Хммм. , , как насчет того, чтобы просто построить значение самостоятельно?

datename(hour, dateadd(minute, 30, max(case when mo.Sentido = 'Entrada' then mo.FechaHora end))) + ':00' as Entrada,

Добавление 30 минут облегчает округление.

...