首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从中的某个范围生成日期列表?

如何从中的某个范围生成日期列表?
EN

Stack Overflow用户
提问于 2018-01-24 17:54:16
回答 3查看 10K关注 0票数 4

Getting date list in a range in PostgreSQL展示了如何在PostgreSQL中获取日期范围。但是,Redshift不支持generate_series()

代码语言:javascript
复制
ans=> select (generate_series('2012-06-29', '2012-07-03', '1 day'::interval))::date;
ERROR:  function generate_series("unknown", "unknown", interval) does not exist
HINT:  No function matches the given name and argument types. You may need to add explicit type casts.

有没有办法复制generate_series()在Redshift中所做的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-01-24 18:06:23

一次黑客攻击,但有效:

使用包含许多行的表和一个窗口函数来生成系列

只要您正在生成一个比用于生成该系列的表中的行数更小的系列,这就可以工作。

代码语言:javascript
复制
WITH x(dt) AS (SELECT '2016-01-01'::date)
SELECT 
    dateadd(
        day, 
        COUNT(*) over(rows between unbounded preceding and current row) - 1, 
    dt)
FROM users, x 
LIMIT 100

初始日期2016-01-01控制开始日期,限制控制生成系列中的天数。

更新:*只在领导节点上运行

Redshift部分支持generate_series函数,但不幸的是,它们的文档中没有提到它。

这将起作用,也是产生一系列日期的最短和最易读的方式(2018-01-29):

代码语言:javascript
复制
SELECT ('2016-01-01'::date + x)::date 
FROM generate_series(1, 100, 1) x
票数 15
EN

Stack Overflow用户

发布于 2018-01-24 19:57:42

如果您不想依赖任何现有的表,一种选择是预生成一个包含一系列数字的系列表,每一行一个。

代码语言:javascript
复制
create table numbers as (
  select
          p0.n
          + p1.n*2
          + p2.n * power(2,2)
          + p3.n * power(2,3)
          + p4.n * power(2,4)
          + p5.n * power(2,5)
          + p6.n * power(2,6)
          + p7.n * power(2,7)
          + p8.n * power(2,8)
          + p9.n * power(2,9)
          + p10.n * power(2,10)
          as number
        from
          (select 0 as n union select 1) p0,
          (select 0 as n union select 1) p1,
          (select 0 as n union select 1) p2,
          (select 0 as n union select 1) p3,
          (select 0 as n union select 1) p4,
          (select 0 as n union select 1) p5,
          (select 0 as n union select 1) p6,
          (select 0 as n union select 1) p7,
          (select 0 as n union select 1) p8,
          (select 0 as n union select 1) p9,
          (select 0 as n union select 1) p10
  order by 1
);

这将创建一个数字从0到2^10的表,如果需要更多的数字,只需添加更多的子句:D。

一旦您拥有了这个表,您就可以加入它作为generate_series的替代。

代码语言:javascript
复制
with date_range as (select 
   '2012-06-29'::timestamp as start_date , 
   '2012-07-03'::timestamp as end_date
)
select
    dateadd(day, number::int, start_date)
from date_range
inner join numbers on number <= datediff(day, start_date, end_date)
票数 6
EN

Stack Overflow用户

发布于 2021-01-06 10:09:51

@michael_erasmus --这很有趣,为了更好的性能,我做了一些修改。

代码语言:javascript
复制
CREATE OR REPLACE VIEW v_series_0_to_1024 AS SELECT
  p0.n 
  | (p1.n << 1) 
  | (p2.n << 2) 
  | (p3.n << 3) 
  | (p4.n << 4) 
  | (p5.n << 5) 
  | (p6.n << 6) 
  | (p7.n << 7) 
  | (p8.n << 8) 
  | (p9.n << 9)
  as number
from
  (select 0 as n union select 1) p0,
  (select 0 as n union select 1) p1,
  (select 0 as n union select 1) p2,
  (select 0 as n union select 1) p3,
  (select 0 as n union select 1) p4,
  (select 0 as n union select 1) p5,
  (select 0 as n union select 1) p6,
  (select 0 as n union select 1) p7,
  (select 0 as n union select 1) p8,
  (select 0 as n union select 1) p9
order by number

最后30天日期系列:

代码语言:javascript
复制
select dateadd(day, -number, current_date) as dt from v_series_0_to_1024 where number < 30
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48428786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档