想要根据DAY差额处理数据

时间:2018-07-16 06:35:06

标签: oracle

查询:

  select 
      TO_CHAR((to_date(IP_START_DATE,'DD-MM-YYYY HH24:MI:SS')+ (level-1)),'DD-MM-YYYY'),     
      TO_CHAR(to_date(IP_START_DATE,'DD-MM-YYYY HH24:MI:SS') + level,'DD-MM-YYYY') ,        
      to_number(regexp_substr(IP_PLAN_CONSUMPTION, '^\d+'))/(TO_DATE(IP_END_DATE, 'DD-MM-YYYY HH24:MI:SS') - TO_DATE(IP_START_DATE, 'DD-MM-YYYY HH24:MI:SS')) || regexp_substr(IP_PLAN_CONSUMPTION, '[A-Z]') as IP_PLAN_CONSUMPTION
         FROM
        dual
        CONNECT BY
        level <= to_date(IP_END_DATE,'DD-MM-YYYY HH24:MI:SS')-to_date(IP_START_DATE,'DD-MM-YYYY HH24:MI:SS')+1;

->查询中的数据:

  select 
      TO_CHAR((to_date('16-07-2018 11:02','DD-MM-YYYY HH24:MI:SS')+ (level-1)),'DD-MM-YYYY'),     
      TO_CHAR(to_date('16-07-2018 11:02','DD-MM-YYYY HH24:MI:SS') + level,'DD-MM-YYYY'),      
      to_number(regexp_substr('4000 T', '^\d+'))/(TO_DATE('18-07-2018 00:00', 'DD-MM-YYYY HH24:MI:SS') - TO_DATE('16-07-2018 11:02', 'DD-MM-YYYY HH24:MI:SS')) || regexp_substr('4000 T', '[A-Z]') as IP_PLAN_CONSUMPTION 
      FROM
      dual
      CONNECT BY
      level <= to_date('18-07-2018 00:00','DD-MM-YYYY HH24:MI:SS')-to_date('16-07-2018 11:02','DD-MM-YYYY HH24:MI:SS')+1;

输出将是: enter image description here

但是应该是 2000吨
不是:如果开始日期:16-07-2018 00:00&结束日期:19-07-2018 00:00,则日差为3天&消耗量为4000 T,则每个日期的插入消耗量应为1333.333333333333 T〜1334 T 。

1 个答案:

答案 0 :(得分:0)

如果要存储日期,则应将其作为DATE数据类型(而不是字符串)存储在表中。

SQL Fiddle

Oracle 11g R2架构设置

CREATE TABLE your_table( id, ip_start_date, ip_end_date, ip_plan_consumption ) AS
  SELECT 1,
         DATE '2018-07-16' + INTERVAL '11:02' HOUR TO MINUTE,
         DATE '2018-07-18' + INTERVAL '00:00' HOUR TO MINUTE,
         '4000 T'
  FROM   DUAL
UNION ALL
  SELECT 2,
         DATE '2018-07-16' + INTERVAL '11:02' HOUR TO MINUTE,
         DATE '2018-07-16' + INTERVAL '23:08' HOUR TO MINUTE,
         '3000 T'
  FROM   DUAL
UNION ALL
  SELECT 3,
         DATE '2018-07-10' + INTERVAL '00:00' HOUR TO MINUTE,
         DATE '2018-07-13' + INTERVAL '23:59' HOUR TO MINUTE,
         '15000 U'
  FROM   DUAL
;

查询1

WITH data ( id, start_dt, end_dt, consumption, units ) AS (
  SELECT id,
         TRUNC( IP_START_DATE ),
         GREATEST( TRUNC( IP_START_DATE ) + 1, TRUNC( IP_END_DATE ) ),
         TO_NUMBER( REGEXP_SUBSTR( IP_PLAN_CONSUMPTION, '^\d+' ) ),
         REGEXP_SUBSTR( IP_PLAN_CONSUMPTION, '\S+$' )
  FROM   your_table
)
SELECT id,
       t.column_value     AS start_dt, 
       t.column_value + 1 AS end_dt,      
       consumption / ( end_dt - start_dt ) || units AS IP_PLAN_CONSUMPTION 
FROM   data d
       CROSS JOIN
       TABLE(
         CAST(
           MULTISET(
             SELECT d.start_dt + LEVEL - 1
             FROM   DUAL
             CONNECT BY d.start_dt + LEVEL - 1 < d.end_dt
           )
           AS SYS.ODCIDATELIST
         )
       ) t

Results

| ID |             START_DT |               END_DT | IP_PLAN_CONSUMPTION |
|----|----------------------|----------------------|---------------------|
|  1 | 2018-07-16T00:00:00Z | 2018-07-17T00:00:00Z |               2000T |
|  1 | 2018-07-17T00:00:00Z | 2018-07-18T00:00:00Z |               2000T |
|  2 | 2018-07-16T00:00:00Z | 2018-07-17T00:00:00Z |               3000T |
|  3 | 2018-07-10T00:00:00Z | 2018-07-11T00:00:00Z |               5000U |
|  3 | 2018-07-11T00:00:00Z | 2018-07-12T00:00:00Z |               5000U |
|  3 | 2018-07-12T00:00:00Z | 2018-07-13T00:00:00Z |               5000U |