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