在PostgreSQL的范围内获取日期列表

Jav*_*avi 57 sql postgresql date date-comparison

我想在PostgreSQL数据库中获取两个日期(包括它们)之间的日期列表.例如,如果我有:

  • 开课日期:2012年6月29日
  • 截止日期:2012年7月3日

那么结果应该是:

29 june 2012
30 june 2012 
1 july 2012 
2 july 2012 
3 july 2012
Run Code Online (Sandbox Code Playgroud)

在PostgreSQL中执行此操作的最佳方法是什么?

谢谢.

man*_*iek 87

select CURRENT_DATE + i 
from generate_series(date '2012-06-29'- CURRENT_DATE, 
     date '2012-07-03' - CURRENT_DATE ) i
Run Code Online (Sandbox Code Playgroud)

甚至更短:

select i::date from generate_series('2012-06-29', 
  '2012-07-03', '1 day'::interval) i
Run Code Online (Sandbox Code Playgroud)


Clo*_*eto 38

作为timestamp:

select generate_series('2012-06-29', '2012-07-03', '1 day'::interval);

    generate_series     
------------------------
 2012-06-29 00:00:00-03
 2012-06-30 00:00:00-03
 2012-07-01 00:00:00-03
 2012-07-02 00:00:00-03
 2012-07-03 00:00:00-03
Run Code Online (Sandbox Code Playgroud)

或者铸造到date:

select (generate_series('2012-06-29', '2012-07-03', '1 day'::interval))::date;

 generate_series 
-----------------
 2012-06-29
 2012-06-30
 2012-07-01
 2012-07-02
 2012-07-03
Run Code Online (Sandbox Code Playgroud)


a_h*_*ame 8

这应该这样做:

select date '2012-06-29' + i
from generate_series(1, (select date '2012-07-3' - date '2012-06-29')) i
Run Code Online (Sandbox Code Playgroud)

如果你不想在subselect中重复start_date,那么事情就会变得复杂一些:

with min_max (start_date, end_date) as (
   values (date '2012-06-29', date '2012-07-3')
), date_range as (
  select end_date - start_date as duration
  from min_max
)
select start_date + i
from min_max
  cross join generate_series(1, (select duration from date_range)) i;
Run Code Online (Sandbox Code Playgroud)

(请参阅maniek的答案,以获得更好的"无重复"问题)

  • simplier,而不重复:'+ i.从generate_series选择CURRENT_DATE(日期"2012-06-29'- CURRENT_DATE,日期 '2012-07-03' - CURRENT_DATE)i` (2认同)

小智 6

select generate_series('2012-06-29', '2012-07-03', '1 day'::interval)::date;
Run Code Online (Sandbox Code Playgroud)


BJu*_*ury 5

对于这样的事情,在系统中有一个日期表通常很方便.

就像数字表一样,它们可以非常有用并且比使用生成日期更快,特别是当您扩展到大型数据集时.

从1900年到2100年这样的日期表将非常小,因此存储空间不大.

编辑:Dunno为什么这会被拒绝,它可能是最好的表现.此外,它还有许多其他优点.想要将订单链接到季度绩效数字?它是表之间的简单链接.(Order.OrderDate - > Dates.Date - > Dates.Quarter - > PerformanceTotal.Quarter)等,其与工作日内处理,也不像一个月的最后一个工作日,或前一个月的第一个星期二是相同的.像数字表一样,我强烈推荐它们!