首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >2个或更多记录中开始日期和结束日期之间的Oracle SQL重叠

2个或更多记录中开始日期和结束日期之间的Oracle SQL重叠
EN

Stack Overflow用户
提问于 2017-03-14 04:30:55
回答 2查看 776关注 0票数 1

数据库my_table

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
id     seq     start_date     end_date
1      1       01-01-2017     02-01-2017
1      2       07-01-2017     09-01-2017
1      3       11-01-2017     11-01-2017
2      1       20-01-2017     20-01-2017
3      1       01-02-2017     02-02-2017
3      2       03-02-2017     04-02-2017
3      3       08-01-2017     09-02-2017
3      4       09-01-2017     10-02-2017
3      5       10-01-2017     12-02-2017

我的要求是获取第一个日期(通常是序列1开始日期)和结束日期(通常是最后一个序列结束日期),以及每个唯一ID在所有序列中发生的日期数。

发生日期:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
id      1              2              3
        01-01-2017     20-01-2017     01-02-2017
        02-01-2017                    02-02-2017
        07-01-2017                    03-02-2017
        08-01-2017                    04-02-2017
        09-01-2017                    08-02-2017
        11-01-2017                    09-02-2017
                                      10-02-2017
                                      11-02-2017
                                      12-02-2017
total   6              1              9

下面是我想要的结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
id     start_date     end_date       num_date
1      01-01-2017     11-01-2017     6
2      20-01-2017     20-01-2017     1
3      01-02-2017     12-02-2017     9

我试过了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT   id
         , MIN(start_date)
         , MAX(end_date)
         , SUM(end_date - start_date + 1)
FROM     my_table
GROUP BY id

由于开始日期和结束日期之间没有重叠日期,因此这条SQL语句在id1和id2中工作得很好。但是对于id 3,结果num_date是11。您能建议使用SQL语句来解决这个问题吗?谢谢。

还有一个问题:数据库中的日期是datetime格式的。如何将其转换为date。我尝试使用TRUNC函数,但有时它会将日期转换为昨天。

EN

回答 2

Stack Overflow用户

发布于 2017-03-14 04:59:25

您需要计算一个end_date等于下面的start_date的次数。为此,您需要使用lag()lead()分析函数。您可以使用case表达式进行比较,但遗憾的是,您不能将case表达式包装在同一查询中的COUNTSUM中;您需要一个子查询和一个外部查询。

就像这样;没有经过测试,因为您没有提供CREATE TABLE和INSERT语句来重新创建示例数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select   id, min(start_date) as start_date, max(end_date) as end_date,
         sum(end_date - start_date + 1 - flag) as num_days
from     ( select id, start_date, end_date, 
                  case when start_date = lag(end_date) 
                            over (partition by id order by end_date) then 1
                                                                     else 0 end as flag
           from   my_table
         )
group by id;
票数 1
EN

Stack Overflow用户

发布于 2017-03-14 09:28:06

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT id,
       MIN( start_date ) AS start_date,
       MAX( end_date )   AS end_date,
       SUM( end_date - start_date + 1 ) AS num_days
FROM   (
  SELECT id,
         GREATEST(
           start_date,
           COALESCE(
             LAG( end_date ) OVER ( PARTITION BY id ORDER BY seq ) + 1,
             start_date
           )
         ) AS start_date,
         end_date
  FROM   your_table
)
WHERE  start_date <= end_date
GROUP BY id;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42777797

复制
相关文章
shell 开始日期 结束日期循环
shell 日期循环 #!/bin/sh if [ $# == 2 ]; then datebeg=$1 dateend=$2 else echo "请输入开始时间和结束日期,格式为2017-04-04" exit 1 fi beg_s=`date -d "$datebeg" +%s` end_s=`date -d "$dateend" +%s` echo "处理时间范围:$beg_s 至 $end_s" while [ "$beg_s" -le "$end_s"
大数据工程师-公子
2019/03/14
2.8K0
当前日期得到本周的开始和结束日期
本文由来源 21aspnet,由 javajgs_com 整理编辑,其版权均为 21aspnet 所有,文章内容系作者个人观点,不代表 Java架构师必看 对观点赞同或支持。如需转载,请注明文章来源。
Java架构师必看
2021/03/22
2.8K0
js根据年月获取这月或者年的开始日期和结束日期
获取月的: //获取这个月的月初和月末 function getMonthStartEnd(vars){ var str = ''; if(vars!=null&&vars!=''){ var nyYear=vars.slice(0,4); var nyMonth=vars.slice(4,vars.length); var firstDay = new Date(nyYear,nyMonth-1); var lastDay =
tongyao
2022/06/09
5.5K0
bootstrap 日期控件起始日期&结束日期相互约束
使用bootstrap的日期控件需要单独引入bootstrap-datetimepicker.min.css和bootstrap-datetimepicker.min.js 详情及文件可以通过下面地址下载:http://www.bootcss.com/p/bootstrap-datetimepicker/index.htm
程序新视界
2022/05/06
3K0
bootstrap 日期控件起始日期&结束日期相互约束
SQL 中的日期和时间类型
在我们SQL中一般支持三种数据类型。 date:日历日期,包括年(四位),月和日。 time: 一天中的时间,包括小时,分和秒。可以用变量time(p)来表示秒的小数点后的数字位数(默认是0)。 通过制定 time with timezone,还可以把时区信息连同时间一起存储。 timestamp: date 和 time的组合。 可以用变量timestamp(p)来表示秒的小数点后的数字位数(这里默认值为6)。如果指定with timezone,则时区信息也会被存储 日期和时间类型的值可按如下方式说明:
Dato
2018/04/17
3.3K0
Power Pivot智能日期运用——当前初始日期/当前结束日期
(六) 当前初始日期 1. OPENINGBALANCEMONTH/ OPENINGBALANCEQUARTER/ OPENINGBALANCEYEAR A) 语法 OpeningBalanceMonth (<expression>, <dates> [, <filter>]) OpeningBalanceQuarter (<expression>, <dates> [, <filter>]) OpeningBalanceYear (<expression>, <dates> [, <filter>] [,
逍遥之
2020/03/24
2.7K0
Power Pivot智能日期运用——当前初始日期/当前结束日期
Oracle中的日期间查询
在Oracle中,如果要进行日期间的查询需要用到Oracle的内置函数to_date()。
陈树义
2022/04/29
3.6K0
oracle 转number日期,oracle number型日期转date型日期
在搞数据库时,发现有这样的一个字段,类型是NUMBER(38),查看了一下里面的数据,都是这样的,
全栈程序员站长
2022/09/15
8K0
sql中datetime日期类型字段比较(mysql&oracle)
mysql 可以直接用大于号,也可以用  between  and SELECT * FROM users WHERE UPDATE_DATE >= '2021-08-12 11:22:09' AND UPDATE_DATE <= '2021-08-15 11:22:33'; SELECT * FROM users WHERE UPDATE_DATE BETWEEN '2021-08-12 11:22:09' AND '2021-08-15 11:22:33'; Oracle oracle sql日期比较
红目香薰
2022/11/29
3.5K0
日期sql
select date_add(curdate(),interval -day(curdate())+1 day) 2020-01-01 今天所在月份第一天
Centy Zhao
2020/02/11
6580
Java获取两个日期之间的日期
/** * 获取两个日期之间的日期 * @param start 开始日期 * @param end 结束日期 * @return 日期集合 */ private List<Date> getBetweenDates(Date start, Date end) { List<Date> result = new ArrayList<Date>(); Calendar tempStart = Calendar.g
水煮麥楽雞
2022/11/20
6.1K0
js获取上周、本周、上月、本月、上季度、本季度的开始日期、结束日期(无bug)
/** * 获取上周、本周、上月、本月、上季度、本季度的开始日期、结束日期 start * 亲测无bug。获取上月开始结束日期考虑了年份的变化 */ var now = new Date(); //当前日期 var nowDayOfWeek = now.getDay()-1; //今天本周的第几天 var nowDay = now.getDate(); //当前日 var nowMonth = now.getMonth(); //当前月 var nowYear = now.getYear(); //当
用户1065635
2019/11/27
7.2K0
Oracle日期处理
TRUNC(date)函数返回date当天的时间部分被格式模型fmt截断到指定的单位
WindCoder
2020/02/10
1.2K0
mysql插入日期 vs oracle插入日期
今天做oracle日期插入的时候突然开始疑惑日期是如何插入的。 用框架久了,反而不自己做简单的工作了。比如插入。 通常,新建一个表对象,然后绑定数据,前端form提交,后端getModel后直接model.save()就完事了。 像insert这样的语句很少写了,除了备份sql的时候。 言归正传, mysql插入日期不限制分隔符,不必明确格式, 至少测试了n次都成功了。 1 INSERT INTO person(name,birth) values('dd','2015-02-02'); 2 INSERT
Ryan-Miao
2018/03/13
7.5K0
Oracle 通过sql to_date()和 to_char() 转化日期格式
这两个日期字段都是8位长度的字符类型的。如果插入的话就是这样的 :例如"20191221"
zpzp6
2023/03/25
1.6K0
sql语句日期格式_sql日期类型怎么写
SQL Server中文版的默认的日期字段datetime格式是yyyy-mm-dd Thh:mm:ss.mmm 例如: select getdate() 2004-09-12 11:06:08.177 整理了一下SQL Server里面可能经常会用到的日期格式转换方法: 举例如下: select CONVERT(varchar, getdate(), 120 ) 2004-09-12 11:06:08
全栈程序员站长
2022/11/01
2.5K0
Net和T-sql中的日期函数操作
net中的日期函数代码:  代码 数据库的日期函数: 函数 参数/功能 GetDate( ) 返回系统目前的日期与时间 DateDiff (interval,date1,date2) 以interval 指定的方式,返回date2 与date1两个日期之间的差值 date2-date1 DateAdd (interval,number,date) 以interval指定的方式,加上number之后的日期 DatePart (inte
磊哥
2018/05/09
1.3K0
sql中时间戳转日期
需求: 我将博客和 typecho 后台结合起来,打算做一个在线说说的功能,在 typecho 中输入内容,然后调用接口,实现在我的博客查看说说功能的功能。是不是有点绕?我也这么觉得,但是折腾一下也挺好的。
子舒
2022/06/09
4.3K0
sql中时间戳转日期
sql语句日期_sql中字符串和变量拼接
转载于:https://www.cnblogs.com/hoge66/p/11198213.html
全栈程序员站长
2022/11/09
1.2K0
golang如何计算两个日期之间的日期差?
golang如何计算两个日期之间的日期差? 日期格式:“2017-09-01” ,“2018-03-11”
双面人
2022/09/28
7.4K0

相似问题

SQL“重叠”只获取开始和结束之间的日期(不包括开始日期和结束日期)

34

记录之间开始日期和结束日期范围的SQL查询

10

SQL查找给定开始日期和结束日期的重叠日期

125

在一行中打印oracle SQL中连续或重叠日期范围的开始日期和结束日期

228

oracle sql -查找日期(开始/结束列)重叠的条目

42
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文