当前位置: 首页 > 面试题库 >

需要Oracle SQL按日期划分日期/时间范围

谢麒
2023-03-14
问题内容

我希望得到一些帮助,以帮助我编写一些自己编写的SQL语句。

我有一张数据表:

ID StartDate EndDate
1 01/01/2000 04:30 PM 01/03/2000 06:15 AM
2000/01/04 08:10 AM 01/04/2000 07:25 AM
3 01/05/2000 11:00 AM 01/06/2000 03:45 AM

我需要获得以下信息:

ID StartDate EndDate
1/01/01/2000 04:30 PM 01/01/2000 11:59 PM
1 01/02/2000 12:00 AM 01/02/2000 11:59 PM
1 01/03/2000 12:00 AM 01/03/2000 06:15 AM
2000/01/04 08:10 AM 01/04/2000 07:25 AM
3 01/05/2000 11:00 AM 01/05/2000 11:59 PM
3 01/06/2000 12:00 AM 01/06/2000 03:45 AM

换句话说,按日期划分日期范围。在SQL中甚至可能吗?

我的数据库是Oracle 11G R2,由于某些情况,我担心不能使用PL / SQL。


问题答案:

可以在SQL中执行此操作。有两个技巧。首先是生成一系列数字,您可以使用进行CTE处理connect

第二个是将正确的逻辑放在一起以扩展日期,同时保留正确的开始和结束时间。

以下是一个示例:

with n as (
      select level n
      from dual connect by level <= 20
     ),
     t as (
      select 1 as id, to_date('01/01/2000 4', 'mm/dd/yyyy hh') as StartDate, to_date('01/03/2000 6', 'mm/dd/yyyy hh') as EndDate from dual union all
      select 2 as id, to_date('01/04/2000 8', 'mm/dd/yyyy hh') as StartDate, to_date('01/04/2000 12', 'mm/dd/yyyy hh') as EndDate from dual union all
      select 3 as id, to_date('01/05/2000', 'mm/dd/yyyy') as StartDate, to_date('01/06/2000', 'mm/dd/yyyy') as EndDate from dual
     )
select t.id,
       (case when n = 1 then StartDate
             else trunc(StartDate + n - 1)
        end) as StartDate,
       (case when trunc(StartDate + n - 1) = trunc(enddate)
             then enddate
             else trunc(StartDate + n)
        end)
from t join
     n
     on StartDate + n - 1 <= EndDate
order by id, StartDate

在这里它是SQLFiddle。



 类似资料:
  • 感谢所有人!

  • 我想按组计算tab$date[i1]和tab$date[I]之间的时差(以小时为单位)。这里是我的代码: 问题是我同时获得了小时、分钟和秒: 日期是POSIXct数据。我怎样才能只获得小时数?

  • 问题内容: 我正在使用MySQL,并且具有下表: 我希望能够生成这样的报告,其中在过去4周内完成了各个周期: 或最近3个月内: 有什么想法可以进行选择查询以生成等效的日期范围和点击次数吗? 问题答案:

  • 问题内容: 我有一列希望按日期时间分组而不创建新列。这可能是我当前的代码不起作用吗? 问题答案: 正如@JosephCottam所建议的 过时的用途 您可以将索引设置为并使用

  • 本文向大家介绍coldfusion 日期或时间范围,包括了coldfusion 日期或时间范围的使用技巧和注意事项,需要的朋友参考一下 示例 日期或时间范围的示例。

  • 问题内容: 我需要填充一个表,该表将存储2个给定日期之间的日期范围:09/01/11-10/10/11 因此,在这种情况下,该表将从2011年9月1日开始存储,直到每天存储到10/10/11,我想知道在SQL Server中是否有一种巧妙的方法-我目前正在使用SQL Server 2008 。 谢谢 问题答案: 在SQL 2005+上很容易;如果您有数字表或理货表,操作会更容易。我在下面伪造了它: