2013-12-19 6 views
0

У меня есть следующая формула для преобразования продолжительности в часы. Я хочу сделать случай, когда любая продолжительность, которая составляет 15 минут или более, считается часом. например, 1 час 15 минут будут рассчитаны как 2 часа, 2 часа 15 минут будут рассчитаны как 3 часа и так далее. если он меньше 15 минут через час, чем час. например, 1 час 5 минут, считается 1 час.Сводка для расчета часов

((Дело T0.DurType, когда 'M', то (/ 100)/T0.Duration. 60, когда 'D', затем (T0.Duration * 8) Else T0.Duration End)) как 'Продолжительность'

+0

Что содержит 'столбец T0.Duration', я имею в виду милли-секунды, секунды или что-то еще. – user2989408

+0

Продолжительность - это вычисленная колонка. Он отображает разницу между временем начала и временем окончания, которые являются int. оно числовое. – user2363530

+0

Но продолжительность измеряется в формате времени, таком как годы, дни, часы, секунды и т. Д., И все они являются ints. – user2989408

ответ

1
  1. Вы делаете это в SQL или в виде поля формулы в Crystal?
  2. Является ли case синтаксисом по какой-либо причине или это просто тот подход, который вы изначально выбрали?
  3. Какой единицы времени каждый приращение Duration представляет, 1 секунду, 1 минута?

Предполагая следующее:

  • это в SQL синтаксисе
  • case не требуется
  • каждый прирост Duration составляет 1 минуту

Тогда вот ваша правильная формула , используя ceiling, а не case:

ceiling(T0.Duration/60) as "Duration" 

Это будет увеличивать любое частичное десятичное значение до ближайшего большего целого числа, например, 75 минут/60 = 1,25 часа, и потолок будет увеличиваться до 2. 180 минут/60 = 3.00 часов и потолок будет выводить 3.

EDIT: Я не уверен, что вы имеете в виду, добившись его в SQL & кристалла ... если вычислить его в SQL, он передается Хрусталь и не потребуется каких-либо дальнейших преобразований. В любом случае, вот оба решения:

  • Crystal: Предполагается, что используются минуты. оператор «\» является целым делением, поэтому десятичная метка отбрасывается. Простой, если/то/другое iif используется для добавления 1 или ноль, если остаток минут 15 или более:
    MINUTES \ 60 + IIF (MINUTES mod 60 >= 15,1 , 0)

  • В SQL (синтаксис MySQL, MSSQL/TSQL могут различаться) достигает такой же, как следует :

    floor(MINUTES/60) + IF((MINUTES % 60) >= 15,1 , 0)

+0

Я использовал случай, потому что когда мы включаем поле продолжительности в нашем запросе, оно отображает минуты, например, 15 минут, как 15 и один час, как 1 в студии управления. Однако в SAP он отображает его как 15 минут или 1 час. Я не знал о потолке, так как у меня мало знаний о sql dev. Однако функция потолка будет конвертировать что-либо более 1 часа в 2 часа, даже если это один минус. где, как и в моем случае, он должен конвертировать только в 15 минут. – user2363530

+0

Я хочу достичь его в sql и в кристалле. – user2363530

+0

См. Редактирование моего ответа – Promethean

Смежные вопросы