计算不同日期间隔的日期之间的出现次数

时间:2018-08-28 08:47:18

标签: mysql sql date datetime

我有一个查询,可以给我一个这样的表:

 Person | Date_IN | Date_OUT | Structure

一年中,一个人多次执行ENTER和EXIT,ENTER和EXIT也可能是同一天。

我想在一年中的某一天计算每个结构中有多少人。

最终目标是在给定的时间(3月1日至3月31日)内,每个建筑物每天的总人数。

3 个答案:

答案 0 :(得分:2)

我相信以下方法会起作用。假定您有一个日期表(由一列组成,其中包含1950年至2050年之间的所有日期),并且只需将其与人员签入/签出表结合在一起即可:

SELECT dates.date, Structure, COUNT(DISTINCT Person) Persons_on_That_Date
FROM dates
LEFT JOIN turndata ON dates.date BETWEEN Date_IN AND Date_OUT
WHERE dates.date BETWEEN '2018-03-01' AND '2018-03-31'
GROUP BY dates.date, Structure
ORDER BY Structure, dates.date

Demo Here

注意:以上假设出发日期包含在内(该人在该日期被计为内部)。如果过期是排他性的,则ON子句变为:

... ON Date_IN <= dates.date AND dates.date < Date_OUT

答案 1 :(得分:0)

请在下面的查询中使用,数据按特定时间范围的结构分组。

SELECT structure, COUNT(DISTINCT person) as no_of_person
FROM table_name
WHERE DATE(Date_IN) BETWEEN '2018-08-01' AND '2018-08-31'
GROUP BY structure

答案 2 :(得分:0)

您说同一天和一个人不能有多个date_in,因为一个人至少有一天。因此,对于给定的日期,我们只需要查看每个人的最新事件,然后再查看该人是否在该日期。

这些步骤是:

  • 动态创建所需日期的数据集
  • 与表格连接并获取直到最后一天的每人date_in
  • 再次与表连接以获取最后的记录
  • 每天汇总并计算在场人数

这是:

select
  data.day
  sum(t.date_in is not null and (t.date_out is null or t.date_out = data.day)) as count_in
from
(
  select days.day, t.person, max(t.date_in) as max_date_in
  from (select date '2018-03-01' as day union all ...) days
  left join t on t.date_in <= days.day
  group by days.day, t.person
) data
left join t on t.person = data.person and t.date_in = data.max_date_in
group by data.day
order by data.day;