Sql 如何使用Postgres仅用一条语句返回两列之间的一系列日期?
我有下表:Sql 如何使用Postgres仅用一条语句返回两列之间的一系列日期?,sql,postgresql,activerecord,generate-series,dateinterval,Sql,Postgresql,Activerecord,Generate Series,Dateinterval,我有下表: create_table "activities", force: :cascade do |t| ... t.date "start_date", null: false t.time "start_time", null: false t.date
create_table "activities", force: :cascade do |t|
...
t.date "start_date", null: false
t.time "start_time", null: false
t.date "end_date", null: false
t.time "end_time", null: false
...
end
此表可以包含start\u date
等于end\u date
的活动,以及以不同于start\u date
的日期结束的其他活动
我试图做的是构建一个SQL查询,它将返回所有日期,并在两个日期之间执行一些活动
例如:
活动1:开始日期:2015-04-15,结束日期:2015-04-15
活动2:开始日期:2015-04-16,结束日期:2015-04-18
start\u date
和end\u date
,例如:
- 开始日期:2015-04-01
结束日期:2015-04-30
- 2015-04-15
- 2015-04-16
- 2015-04-17
- 2015-04-18
generate_series
Postgres函数有助于解决这个问题,但是如何解决呢?
INSERT INTO activities VALUES
('2015-04-15', '2015-04-15'),
('2015-04-16', '2015-04-18'),
('2015-04-01', '2015-04-03')
;
您可以使用生成\u系列
:
SELECT DISTINCT generate_series(start_date, end_date, '1 day'::interval) AS date
FROM activities
ORDER BY date;
┌────────────────────────┐
│ date │
├────────────────────────┤
│ 2015-04-01 00:00:00+02 │
│ 2015-04-02 00:00:00+02 │
│ 2015-04-03 00:00:00+02 │
│ 2015-04-15 00:00:00+02 │
│ 2015-04-16 00:00:00+02 │
│ 2015-04-17 00:00:00+02 │
│ 2015-04-18 00:00:00+02 │
└────────────────────────┘
(7 rows)
编辑:不知何故忘记了A和B部分之间的连接 与: 您可以使用
生成\u系列
:
SELECT DISTINCT generate_series(start_date, end_date, '1 day'::interval) AS date
FROM activities
ORDER BY date;
┌────────────────────────┐
│ date │
├────────────────────────┤
│ 2015-04-01 00:00:00+02 │
│ 2015-04-02 00:00:00+02 │
│ 2015-04-03 00:00:00+02 │
│ 2015-04-15 00:00:00+02 │
│ 2015-04-16 00:00:00+02 │
│ 2015-04-17 00:00:00+02 │
│ 2015-04-18 00:00:00+02 │
└────────────────────────┘
(7 rows)
编辑:不知何故忘记了A和B部分之间的连接
如果要提供参数,请执行以下操作:
select generate_series(p_startdate, p_enddate, '1 day'::interval)
如果要从数据中获取它们,可以执行以下操作:
select generate_series(min(startdate), max(enddate), '1 day'::interval
from activities
我认为您正在寻找以下两者的组合:
select distinct s.dte
from activities a join
generate_series(p_startdate, p_enddate, '1 day'::interval) s(dte)
on s.dte >= a.startdate and s.dte < a.enddate;
选择不同的s.dte
从活动中加入
生成序列(p_开始日期、p_结束日期、“1天”::间隔)s(dte)
在s.dte>=a.startdate和s.dte
如果要提供参数:
select generate_series(p_startdate, p_enddate, '1 day'::interval)
如果要从数据中获取它们,可以执行以下操作:
select generate_series(min(startdate), max(enddate), '1 day'::interval
from activities
我认为您正在寻找以下两者的组合:
select distinct s.dte
from activities a join
generate_series(p_startdate, p_enddate, '1 day'::interval) s(dte)
on s.dte >= a.startdate and s.dte < a.enddate;
选择不同的s.dte
从活动中加入
生成序列(p_开始日期、p_结束日期、“1天”::间隔)s(dte)
在s.dte>=a.startdate和s.dte