Как отобразить время с условием - PullRequest
0 голосов
/ 08 февраля 2011

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

Таблица1

ID  |  Intime  |   Outtime
--------------------------
001 | 00:21:00 |  00:48:00
002 | 08:14:00 |  13:45:00
003 | 00:34:00 |  00:18:00

Формат времени: ЧЧ: ММ: СС

Пробный код.

SELECT dateadd(mi, datediff(mi,0, Intime)/30*30, 0) AS 'Intime'
  FROM Table1

Над запросомвыдача результата в течение 30 минут или 1 часа, что означает, что минуты меньше 30, затем он отображает 30 минут, минуты больше 30, а затем 1 час

Мне нужно отобразить время как 15 минут, 30минут или 1 часов, должно отображаться время округления с условием

Условия:

If minutes is less than 15 minutes then it should display exactly 15 Minutes, for example 03:15:00
If minutes is greater than 15 minutes and less than 45 minutes then it should display exactly 30 Minutes, for example 03:30:00
If minutes is greater than 45 minutes then it should display exactly 1 hour, for example 04:00:00

Ожидаемый результат из таблицы1

ID |Интайм |Outtime

001 | 00:30:00 | 01:00:00
002 | 08:15:00 | 14:00:00
003 | 00:30:00 | 00:30:00

Как сделать запрос для времени округления с условием.

Нужна помощь по запросу

1 Ответ

1 голос
/ 08 февраля 2011

Буквальная интерпретация вашего вопроса:

select id,
InTime = DateAdd(mi,
    case
    when DateAdd(hh, -DATEDIFF(HH, 0, intime), intime) = '00:00:00' then 0
    when DateAdd(hh, -DATEDIFF(HH, 0, intime), intime) <= '00:15:00' then 15
    when DateAdd(hh, -DATEDIFF(HH, 0, intime), intime) <= '00:45:00' then 30
    else 60
    end, DateAdd(hh, DATEDIFF(HH, 0, intime), 0)),
OutTime = DateAdd(mi,
    case
    when DateAdd(hh, -DATEDIFF(HH, 0, OutTime), OutTime) = '00:00:00' then 0
    when DateAdd(hh, -DATEDIFF(HH, 0, OutTime), OutTime) <= '00:15:00' then 15
    when DateAdd(hh, -DATEDIFF(HH, 0, OutTime), OutTime) <= '00:45:00' then 30
    else 60
    end, DateAdd(hh, DATEDIFF(HH, 0, OutTime), 0))
from tbl

Но, учитывая ваш вывод, ваше третье правило должно было быть

Если количество минут больше [ИЛИ РАВНО ДО] 45 минут, тогда должно отображаться ровно 1 час, например 04: 00: 00

Таким образом, запрос становится

select id,
InTime = DateAdd(mi,
    case
    when DateAdd(hh, -DATEDIFF(HH, 0, intime), intime) = '00:00:00' then 0
    when DateAdd(hh, -DATEDIFF(HH, 0, intime), intime) <= '00:15:00' then 15
    when DateAdd(hh, -DATEDIFF(HH, 0, intime), intime) < '00:45:00' then 30
    else 60
    end, DateAdd(hh, DATEDIFF(HH, 0, intime), 0)),
OutTime = DateAdd(mi,
    case
    when DateAdd(hh, -DATEDIFF(HH, 0, OutTime), OutTime) = '00:00:00' then 0
    when DateAdd(hh, -DATEDIFF(HH, 0, OutTime), OutTime) <= '00:15:00' then 15
    when DateAdd(hh, -DATEDIFF(HH, 0, OutTime), OutTime) < '00:45:00' then 30
    else 60
    end, DateAdd(hh, DATEDIFF(HH, 0, OutTime), 0))
from tbl


RE ваш предыдущий вопрос

Вы приняли ответ в своем предыдущем вопросе , который всегда КРУГЛЫЙ ВНИЗ , когда был ответ, который округлился правильно? Неверное описание

Выше запроса, дающего результат в течение 30 минут или 1 часа, что означает, что минут меньше 30, тогда как отображается 30 минут

Это не так. select dateadd(mi, datediff(mi,0, '09:21')/30*30, 0) возвращает 09:00, округляя ВНИЗ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...