sql - Oracle,SQL,如何获取日期之间的间隔

标签 sql oracle timestamp intervals

我需要帮助解决问题。其实我不知道是否可以直接用SQL来解决。

我有一份作品 list 。每件作品都有开始日期和结束日期,格式如下

YYYY/MM/DD  HH24:MI:SS

我需要计算这些工作的成本,小时价格取决于完成工作的时间间隔:

Nigth time: 22:00 to 6:00, for example: 20 €/h
Normal time: the rest 17 €/h

所以,如果我有这样的样本:

wo     start                 end
21    2017/11/16 21:25:00    2017/11/16 22:55:00
22    2017/11/17 05:45:00    2017/11/17 07:05:00
23    2017/11/18 23:00:00    2017/11/19 1:10:00
24    2017/11/17 18:00:00    2017/11/17 19:00:00

我需要计算 22 点和 6 点之间的日期间隔以及其余日期,然后将它们乘以相应的价格

wo     rest(minutes)   night(minutes)
21      35              55
22      15              65
23       0              130
24       1               0

提前感谢您的帮助。

最佳答案

呵呵。如果你真的想要的话:)

出于测试目的,添加了第五条记录(开始于 2016 年 10 月 30 日)。

SQL> with
  2    src as (select timestamp '2017-11-16 21:25:00' b, timestamp '2017-11-16 22:55:00' f from dual union all
  3            select timestamp '2017-11-17 05:45:00' b, timestamp '2017-11-17 07:05:00' f from dual union all
  4            select timestamp '2017-11-18 23:00:00' b, timestamp '2017-11-19 1:10:00' f from dual union all
  5            select timestamp '2017-11-17 18:00:00' b, timestamp '2017-11-17 19:00:00' f from dual union all
  6            select timestamp '2016-10-30 00:00:00' b, timestamp '2016-11-03 23:00:00' f from dual),
  7    srd as (select b, f, f - b t from src),
  8    mmm as (select min(trunc(b)) b, max(trunc(f)) f from src),
  9    rws as (select b + 6/24 + rownum - 1 b, b + 22/24 + rownum - 1 f from mmm connect by level <= f - b + 1),
 10    mix as (select s.b, s.f, s.t, r.b rb, r.f rf from srd s, rws r where s.f >= r.b (+) and r.f (+) >= s.b),
 11    clc as (select b, f, t, nvl(numtodsinterval(sum((least(f, rf) + 0) - (greatest(b, rb) + 0)), 'DAY'), interval '0' second) d from mix group by b, f, t)
 12  select
 13    to_char(b, 'dd.mm.yyyy hh24:mi') as "datetime begin",
 14    to_char(f, 'dd.mm.yyyy hh24:mi') as "datetime finish",
 15    cast(t as interval day to second(0)) as "total time",
 16    cast(d as interval day to second(0)) as "daytime",
 17    cast(t - d as interval day to second(0)) as "nighttime"
 18  from
 19    clc
 20  order by
 21    1, 2;

datetime begin     datetime finish    total time     daytime        nighttime
------------------ ------------------ -------------- -------------- --------------
16.11.2017 21:25   16.11.2017 22:55   +00 01:30:00   +00 00:35:00   +00 00:55:00
17.11.2017 05:45   17.11.2017 07:05   +00 01:20:00   +00 01:05:00   +00 00:15:00
17.11.2017 18:00   17.11.2017 19:00   +00 01:00:00   +00 01:00:00   +00 00:00:00
18.11.2017 23:00   19.11.2017 01:10   +00 02:10:00   +00 00:00:00   +00 02:10:00
30.10.2016 00:00   03.11.2016 23:00   +04 23:00:00   +03 08:00:00   +01 15:00:00

关于sql - Oracle,SQL,如何获取日期之间的间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47507822/

相关文章:

mysql - 是否有一个子查询可以使用同一表中不同列的最大日期来计算 datediff?

oracle - 获取外部表的位置和文件名?

oracle - ORA-02065 : illegal option for ALTER SYSTEM

Mysql时间戳数据类型

php - 插入数据并在列中添加前一行数据

mysql - mysql连接问题

sql - 如何在单个选择中区分具有相似值的行?

bash - 使用时间戳 bash 删除文件中超过一小时的行

vba - 如何使用VBA检查文本文件的时间戳

PHP-MYSQL语法错误