gpt4 book ai didi

sql - 需要 Oracle SQL 按天拆分日期/时间范围

转载 作者:行者123 更新时间:2023-12-04 13:38:15 25 4
gpt4 key购买 nike

我希望能得到一些帮助来编写一些我自己没有成功编写的 SQL。

我有一个包含数据的表:

ID 开始日期 结束日期
1 01/01/2000 04:30 PM 01/03/2000 06:15 AM
2 01/04/2000 08:10 AM 01/04/2000 07:25 AM
3 01/05/2000 11:00 AM 01/06/2000 03:45 AM

我需要得到以下信息:

ID 开始日期 结束日期
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
2 01/04/2000 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 中执行此操作。有两个技巧。第一个是生成一系列数字,您可以使用 connect 对 CTE 进行处理。 .

第二个是组合正确的逻辑来扩展日期,同时保持开始和结束的正确时间。

下面是一个例子:

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

Here它在 SQLFiddle 上。

关于sql - 需要 Oracle SQL 按天拆分日期/时间范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17035176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com