Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何使用Postgres仅用一条语句返回两列之间的一系列日期?_Sql_Postgresql_Activerecord_Generate Series_Dateinterval - Fatal编程技术网

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
该应用程序使用RubyonRails编写,数据库位于Postgres中。这可以用Ruby代码解决,但出于性能原因,我不想这样做

如何在Postgres中仅使用一条SQL语句实现此查询?我认为
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