oracle 用于将输入的小时数转换为1/4小时的公式

jxct1oxe  于 2023-03-17  发布在  Oracle
关注(0)|答案(3)|浏览(143)

我正在创建一个Oracle快速公式,尝试将员工输入的时间四舍五入到最近的1/4小时。

15-22  minutes = 0.25 hours
23- 37 minutes = 0.50 hours
38-52 minutes = 0.75 hours
53 to 1 hr 7 mins  = 1 hour

我能得到输入的小时数。
对于Eg -输入的时间- 5 PM - 8.25 PM,输入的时间为3.42小时,现在应转换为最接近的1/4小时- 3.75。
我应该用什么计算公式把它换算成3.42小时?

uujelgoq

uujelgoq1#

使用Oracle DATE差分进行一些运算。计算1是一天,1 / (24 * 4)是四分之一小时,您可以计算

with dt as (
select date'2023-01-01' +  rownum/(24*60) date_dt from dual 
connect by level <= 24*60 - 1)
select date_dt,
round((date_dt - trunc(date_dt)) * 24 * 4) closest_qh,
trunc(date_dt) + round((date_dt - trunc(date_dt)) * 24 * 4) / (24 * 4) rounded_date,
round((date_dt - trunc(date_dt)) * 24 * 4) / 4 formula
from dt;

输出(为简洁起见而删减)

DATE_DT             CLOSEST_QH ROUNDED_DATE           FORMULA
------------------- ---------- ------------------- ----------
...
01.01.2023 03:21:00         13 01.01.2023 03:15:00       3,25
01.01.2023 03:22:00         13 01.01.2023 03:15:00       3,25
01.01.2023 03:23:00         14 01.01.2023 03:30:00        3,5
01.01.2023 03:24:00         14 01.01.2023 03:30:00        3,5
...
01.01.2023 03:36:00         14 01.01.2023 03:30:00        3,5
01.01.2023 03:37:00         14 01.01.2023 03:30:00        3,5
01.01.2023 03:38:00         15 01.01.2023 03:45:00       3,75
01.01.2023 03:39:00         15 01.01.2023 03:45:00       3,75
...
01.01.2023 03:51:00         15 01.01.2023 03:45:00       3,75
01.01.2023 03:52:00         15 01.01.2023 03:45:00       3,75
01.01.2023 03:53:00         16 01.01.2023 04:00:00          4
01.01.2023 03:54:00         16 01.01.2023 04:00:00          4
xurqigkl

xurqigkl2#

您可以TRUNC将时间计算到小时的开始,然后将分钟和秒部分四舍五入到最接近的15分钟,并加上:

SELECT time,
       TRUNC(time, 'HH') + ROUND((time - TRUNC(time, 'HH'))*4*24)/4/24 AS rounded_time
FROM   times

其中,对于示例数据:

CREATE TABLE times (time) AS
SELECT TRUNC(SYSDATE, 'HH') + NUMTODSINTERVAL(LEVEL, 'MINUTE')
FROM   DUAL
CONNECT BY LEVEL <= 60;

输出:
| 时间|舍入时间|
| - ------|- ------|
| 2023年3月8日08时01分|2023年3月8日08时00分|
| ...|...|
| 2023年3月8日08时07分|2023年3月8日08时00分|
| 2023年3月8日08时08分|2023年3月8日08时15分|
| ...|...|
| 2023年3月8日08时22分|2023年3月8日08时15分|
| 2023年3月8日08时23分|2023年3月8日08时30分|
| ...|...|
| 2023年3月8日08时37分|2023年3月8日08时30分|
| 2023年3月8日08时38分|2023年3月8日08时45分|
| ...|...|
| 2023年3月8日08时52分|2023年3月8日08时45分|
| 2023年3月8日08时53分|2023年3月8日09:00:00|
| ...|...|
| 2023年3月8日09:00:00|2023年3月8日09:00:00|
fiddle

pengsaosao

pengsaosao3#

这就是我对它的理解(一些样本数据和逐步计算;您只能使用result)。

SQL> with test (id, date_from, date_to) as
  2    (select 1, to_date('08.03.2023 17:00', 'dd.mm.yyyy hh24:mi'), to_date('08.03.2023 20:25', 'dd.mm.yyyy hh24:mi') from dual union all
  3     select 2, to_date('08.03.2023 17:00', 'dd.mm.yyyy hh24:mi'), to_date('08.03.2023 20:42', 'dd.mm.yyyy hh24:mi') from dual union all
  4     select 3, to_date('08.03.2023 17:00', 'dd.mm.yyyy hh24:mi'), to_date('08.03.2023 20:06', 'dd.mm.yyyy hh24:mi') from dual union all
  5     select 4, to_date('08.03.2023 17:00', 'dd.mm.yyyy hh24:mi'), to_date('08.03.2023 20:57', 'dd.mm.yyyy hh24:mi') from dual
  6    ),

质询:

7  temp as
  8    (select id, date_from, date_to,
  9            numtodsinterval(date_to - date_from, 'day') diff
 10     from test
 11    )
 12  select id,
 13         to_char(date_from, 'hh24:mi') date_from,
 14         to_char(date_to  , 'hh24:mi') date_to,
 15         --
 16         diff,
 17         extract(hour from diff) hh,
 18         extract(minute from diff) mi,
 19         --
 20         case when extract(minute from diff) between 15 and 22 then 0.25
 21              when extract(minute from diff) between 23 and 37 then 0.50
 22              when extract(minute from diff) between 38 and 52 then 0.75
 23              when extract(minute from diff) < 14              then 0.00
 24              when extract(minute from diff) > 52              then 1.00
 25         end rnd,
 26         --
 27         extract(hour from diff) +
 28         case when extract(minute from diff) between 15 and 22 then 0.25
 29              when extract(minute from diff) between 23 and 37 then 0.50
 30              when extract(minute from diff) between 38 and 52 then 0.75
 31              when extract(minute from diff) < 14              then 0.00
 32              when extract(minute from diff) > 52              then 1.00
 33         end result
 34  from temp
 35  order by id;

 ID DATE_FROM  DATE_TO    DIFF                            HH  MI   RND     RESULT
--- ---------- ---------- ------------------------------ --- --- ----- ----------
  1 17:00      20:25      +000000000 03:25:00.000000000    3  25  0,50        3,5
  2 17:00      20:42      +000000000 03:42:00.000000000    3  42  0,75       3,75
  3 17:00      20:06      +000000000 03:06:00.000000000    3   6  0,00          3
  4 17:00      20:57      +000000000 03:57:00.000000000    3  57  1,00          4

SQL>

相关问题