`
sun201200204
  • 浏览: 299975 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

问题:oracle中插入分割时间的sql语句

    博客分类:
  • SQL
阅读更多

问题:

我的查询一段时间内的每个状态的时间。(每天以7点半作为分割点)
数据库: oracle
表名:table
字段: 状态:status
      时间: mydate
比如我要查询2008-12-01到2008-12-09之间的数据:

 

select status,mydate from table where mydate-7.5/24 > to_date('2008/12/01','YYYY/MM/DD') 
 and mydate-7.5/24 < to_date('2008/12/09','YYYY/MM/DD') order by mydate;

 
即附件中得到的原始数据。然后要在每一天的分割点插入分割时间,状态用分割点的上一条记录的状态(即附件中插入分割时间下面的数据),
右边数据为我要得到的结果。是相邻每条数据的时间差,状态用被减数的状态。
我想用一条sql得到右边的结果,谢谢。

 

解答:

 

思路:
把相邻的两条数据组合成一条数据,然后组装时间段内的所有的分割点的记录。
再group by day,status来查询。
然后判断是用分割点的时间还是用结束的时间来判断来减开始的时间还是分割点的时间。
比如:查找2008年10月份的数据(具体的时间段可以自己设定)

select
  date_list.s_date,
  mc_stat_h.status,
  sum( decode( sign( mc_stat_h.end_date - date_list.end_date ), -1, mc_stat_h.end_date, date_list.end_date ) - 
    decode( sign( mc_stat_h.start_date - date_list.start_date), -1, date_list.start_date, mc_stat_h.start_date ) ) * 24 sum_time
from
(
  select 
    to_date('200810','yyyymm')+(rownum-1) s_date,
    to_date('200810','yyyymm')+(rownum-1)+7.5/24 start_date,
    to_date('200810','yyyymm')+rownum+7.5/24 end_date 
  from dual
  connect by rownum<=last_day(to_date('200810','yyyymm')) - to_date('200810','yyyymm')+1
) date_list,
(
  select
    pre_stat.status,
    pre_stat.start_date,
    nvl(next_stat.end_date, decode( sign(last_day(to_date('200810','yyyymm')) + 1 + 7.5/24 - sysdate), -1 , last_day(to_date('200810','yyyymm')) + 1 + 7.5/24, sysdate)) end_date
  from 
  (
    select
      rownum id,
      status,
      mydate start_date 
    from table 
    order by status_date
  ) pre_stat,
  (
    select
      rownum id,
      mydate end_date 
    from table 
    order by status_date
  ) next_stat
  where 
    pre_stat.id = next_stat.id(+) - 1
  order by pre_stat.start_date
) mc_stat_h
where ( mc_stat_h.start_date >= date_list.start_date and mc_stat_h.start_date < date_list.end_date )
or ( mc_stat_h.end_date >= date_list.start_date and mc_stat_h.end_date < date_list.end_date )
or ( mc_stat_h.start_date <= date_list.start_date and mc_stat_h.end_date >= date_list.start_date )
or ( mc_stat_h.start_date <= date_list.end_date and mc_stat_h.end_date >= date_list.end_date )
group by date_list.s_date, mc_stat_h.status;

 

 

分享到:
评论

相关推荐

    Oracle批处理:使用C# 自带Oracle驱动一次执行多条Sql语句

    Oracle批处理是数据库操作中提高效率的重要手段,尤其是在C#编程环境下,利用Oracle的数据驱动进行批处理,可以显著提升大量SQL语句执行的速度。本文将深入探讨如何在C#中利用Oracle自带的驱动来实现批处理,以一次...

    DBA对Oracle SQL编写规范的总结

    - **规范要求**:SQL语句中除存储字符外,要求所有英文字母全部大写。虽然这不是强制性的,但统一使用大写字母有助于保持代码的一致性。 - **示例**: ```sql UPDATE XT_TAB SET URL = 'http://baidu.com;' ...

    oracle经典sql语句

    以下是一些经典的SQL语句及其详细解释: 1. **复制表结构:** ```sql SELECT * INTO b FROM a WHERE 1&lt;&gt;1 ``` 这个语句用于创建一个新的表`b`,其结构与原始表`a`相同,但不会复制任何数据。`WHERE 1&lt;&gt;1`是一个...

    Sqlserver大数据量插入速度慢或丢失数据的解决方法

    在处理大量数据插入SQL Server数据库的过程中,可能会遇到插入速度慢或者数据丢失的问题。这种情况通常出现在需要批量插入数千甚至上万条记录的场景中。本文将详细介绍如何解决SQL Server在大数据量插入时出现的速度...

    Oracle性能优化方法(SQL篇)

    1. **SQL查询优化**:SQL查询是数据库操作的基础,优化SQL语句可以显著提升性能。这包括了避免全表扫描,使用索引,减少子查询,以及正确使用连接方式(如INNER JOIN, LEFT JOIN等)。理解并运用EXPLAIN PLAN可以...

    oracle sql 帮助文档

    Oracle SQL是甲骨文公司开发的一种关系数据库管理系统(RDBMS)中使用的SQL语言。Oracle的SQL语法强大且复杂,它不仅用于数据定义和数据操作,还包含了用于数据控制和事务控制的功能。以下是基于提供的内容的知识点...

    java定时执行sql语句

    config/sql.txt 中指定需要定时执行的sql语句,使用&lt;&lt;-sql-&gt;&gt;分隔各语句。如: update deviceInfo set ps=1 where status=1 &lt;&lt;-sql-&gt;&gt; delete from deviceInfo set ps=1 where status=0 &lt;&lt;-sql-&gt;&gt; update deviceInfo...

    oracle 存储过程中某入参是逗号分隔,并且参数要使用在in过滤语句中

    oracle存储过程中入参是逗号分隔,并且参数要使用在in过滤语句中查询数据。处理的方法与实现

    Oracle SQL*Plus Pocket Reference, 2nd Edition

    本书《Oracle SQL*Plus Pocket Reference, 2nd Edition》是一部针对Oracle SQL*Plus及其常用SQL查询和数据操作语句的快速参考指南。作者Jonathan Gennick通过本书帮助读者快速查找特定语言元素的语法。值得注意的是...

    Oracle SQL 语句学习

    以上就是Oracle SQL语句学习中的核心知识点,涵盖了关系型数据库的基本概念、SQL语言的分类和功能、以及具体到SELECT语句的使用方法和相关操作。这些内容对于理解和运用Oracle SQL语句进行数据库操作是至关重要的...

    SQL转Oracle的方法

    - Oracle 不允许直接使用 `SELECT` 语句进行插入,除非使用子查询。 - 示例:`INSERT INTO table (column1, column2) SELECT col1, col2 FROM source_table;` 4. **日期函数**: - Oracle 使用 `TO_DATE()` 函数...

    oracle通过sql实现字符串转数字oracle函数

    例如,如果你有一个名为`str_column`的列,其中包含像"12345"这样的字符串,你可以使用以下SQL语句将其转换为数字: ```sql SELECT TO_NUMBER(str_column) AS num_column FROM your_table; ``` 然而,如果字符串中...

    oracle和sqlserver数据迁移VB代码

    但在使用CSV时,需要注意数据格式的统一,特别是日期、时间、货币等特殊类型的处理,以及处理可能出现的空值和分隔符冲突问题。 在VB编程中,错误处理和日志记录也是必不可少的部分,以确保在数据迁移过程中出现的...

    Oracle数据库Sql语句详解大全73431414.pptx

    Oracle数据库Sql语句详解大全73431414.pptx Oracle数据库Sql语句详解大全73431414.pptx是一份详细的Oracle数据库SQL语句教程,涵盖了SELECT语句的基本语法、查询指定列、运算符的使用、空值的处理、列别名、去掉...

    Oracle高性能SQL调整

    然而,当SQL语句中的值变化时,可能会导致硬解析,产生新的执行计划。避免硬解析是SQL调优的重要策略。 6. **并行查询** Oracle支持并行查询,通过分配多个工作线程来加速处理大量数据。合理设置并行度和并行执行...

    Oracle PL/SQL 编程手册(SQL大全)

    - **SQL命令关键字**:在Oracle环境下,共有17个关键字可以作为SQL语句的开头。包括: - `ALTER`:用于修改数据库对象的属性。 - `DROP`:删除数据库对象。 - `REVOKE`:撤销权限。 - `AUDIT`:记录SQL语句的...

    PL/SQL中查询Oracle大数(17位以上)时显示科学计数法的解决方法

    在进行数据库操作时,...为了解决这个问题,可以通过在查询语句中使用`TO_CHAR`函数或者在PL/SQL Developer的设置中进行调整来实现。这两种方法各有优劣,可以根据具体的应用场景和个人喜好来选择最合适的解决方案。

    sql语句大全总结

    4. INSERT INTO 语句:用于向数据库表中插入数据。 数据定义语言(DDL)用于定义和管理数据库的结构,包括: 1. CREATE DATABASE 语句:用于创建新数据库。 2. ALTER DATABASE 语句:用于修改数据库。 3. CREATE ...

    Oracle+SQL精妙SQL语句讲解.txt

    例如,以下SQL语句可以将`TABLE2`中的所有`ROLE`列值按照逗号分隔符合并: ```sql SELECT TABLE1.*, WMSYS.WM_CONCAT(ROLE) FROM TABLE1, TABLE2 WHERE TABLE1.ID = TABLE2.ID GROUP BY TABLE1.ID, TABLE1.NAME; ...

    Oracle 开发DBA SQL编写规范

    - 所有SQL语句中的关键字、函数名以及保留词均应使用小写字母书写。 - 表名、字段名建议使用大写字母书写,以便于区分关键字。 - 示例: ```sql select col1, col2 from tab1 where col3 = 'value'; ``` ##### ...

Global site tag (gtag.js) - Google Analytics