Oracle 要根据日差对数据进行舍入吗

Oracle 要根据日差对数据进行舍入吗,oracle,Oracle,查询: 选择 至字符((至日期(IP开始日期,'DD-MM-YYYY HH24:MI:SS')+(一级)),'DD-MM-YYYY'), 至字符(至日期(IP开始日期,'DD-MM-YYYY HH24:MI:SS')+级别,'DD-MM-YYYY'), 截止日期(截止日期“DD-MM-YYYY HH24:MI:SS”)-截止日期(截止日期“DD-MM-YYYY HH24:MI:SS”)-截止日期(截止日期“DD-MM-YYYY HH24:MI:SS”)|截止日期(截止日期“DD-MM-YYYY

查询:

选择
至字符((至日期(IP开始日期,'DD-MM-YYYY HH24:MI:SS')+(一级)),'DD-MM-YYYY'),
至字符(至日期(IP开始日期,'DD-MM-YYYY HH24:MI:SS')+级别,'DD-MM-YYYY'),
截止日期(截止日期“DD-MM-YYYY HH24:MI:SS”)-截止日期(截止日期“DD-MM-YYYY HH24:MI:SS”)-截止日期(截止日期“DD-MM-YYYY HH24:MI:SS”)|截止日期(截止日期“DD-MM-YYYY HH24:MI:SS”)|
从…起
二重的
通过连接
查询中的级别数据:

  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;
选择
至字符((至日期('2018年7月16日11:02','DD-MM-YYYY HH24:MI:SS')+(一级)),'DD-MM-YYYY'),
至字符(至日期('16-07-2018 11:02','DD-MM-YYYY HH24:MI:SS')+级别,'DD-MM-YYYY'),
作为IP计划消耗量,发送至编号(regexp-substr('4000 T','^\d+')/(发送至日期('18-07-2018 00:00','DD-MM-YYYY HH24:MI:SS')-发送至日期('16-07-2018 11:02','DD-MM-YYYY HH24:MI:SS'))|发送至regexp-substr('4000 T','A-Z')
从…起
二重的
通过连接

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

Oracle 11g R2架构设置

  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;
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
;
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
查询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;
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
;
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

由于其他一些技术原因,我需要以字符串形式存储。@Anjintadel“由于技术原因,我需要以错误的数据类型存储数据”是错误的做法。您可能会因为“业务”原因而被迫这样做,但千万不要因为“技术”原因而这样做,因为有很多更好的“技术”原因可以为工作使用正确的工具(数据类型)。除此之外,答案仍然适用-只需在子查询分解(
WITH
)子句中将其从字符串转换为日期,如果需要将其转换回字符串,则可以在输出
SELECT
子句中使用
to_CHAR
。我的整个存储过程在代码上方更新,因为我在其中添加了您的代码,这是一个显示错误@MT0