如何选择实体的计数,其中时间序列日期介于该实体的开始日期和结束日期之间

Posted

技术标签:

【中文标题】如何选择实体的计数,其中时间序列日期介于该实体的开始日期和结束日期之间【英文标题】:How to select the count of entities, where a time series date is between start and end date of that entity 【发布时间】:2021-04-29 16:47:48 【问题描述】:

我想选择一个日系列,有点像这样:

SELECT generate_series(
   timestamp without time zone '2016-10-16',
   timestamp without time zone '2016-10-17',
   '1 day')

此外,我得到了始终具有开始日期和结束日期的实体。 通过上述查询,我​​想选择实体的数量(计数),这些实体在系列中的那一天在两个日期内。

输出会(有点)像这样: select output

感谢任何帮助!

编辑:这是一个示例表:

table occurrences (
    datestart DATE
    dateend DATE
)

【问题讨论】:

请提供样本数据和期望的结果。 请分享实体表结构。 【参考方案1】:

架构和插入语句:

 create table entities (id int, startdate date,enddate date);
 insert into entities values(1, '2016-10-10','2016-10-18');
 insert into entities values(1, '2016-10-10','2016-10-16');
 insert into entities values(1, '2016-10-15','2016-10-16');
 insert into entities values(1, '2016-10-17','2016-10-18');

查询:

 with dateseries as
 (
 SELECT generate_series(
    timestamp without time zone '2016-10-16',
    timestamp without time zone '2016-10-20',
    '1 day')
 
 )
 select generate_series,
 (select count(*) from entities e where d.generate_series between e.startdate and e.enddate)  entities_count
 from dateseries d 

输出:

generate_series entities_count
2016-10-16 00:00:00 3
2016-10-17 00:00:00 2
2016-10-18 00:00:00 2
2016-10-19 00:00:00 0
2016-10-20 00:00:00 0

dbhere

【讨论】:

@Don,不客气。很高兴知道它有帮助。最良好的祝愿。【参考方案2】:

如果我理解正确,你可以这样做:

SELECT gs.dte, COUNT(e.entity_id)
FROM generate_series('2016-10-16'::date, '2016-10-17'::date, '1 day') gs(dte) LEFT JOIN
     entities e
     ON e.startdate < gs.dte + interval '1 day' AND
        e.enddate >= gs.dte
GROUP BY gs.dte;

对于您想要实现的逻辑来说,日期似乎已经足够了,但是您当然可以使用时间戳来代替。

【讨论】:

以上是关于如何选择实体的计数,其中时间序列日期介于该实体的开始日期和结束日期之间的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JPA 初始化表示其插入数据库的日期时间的实体字段?

将实体框架对象序列化为 JSON

如何将日期类型保存到 Swift Core Data 中实体的属性?

当实体在不同的项目中时,为啥 Mediator 不解析方法?

如何从实体序列化为json?

无论日期如何,检查给定时间是不是介于两次之间