根据每个月中的特定日期生成系列-postgresql

阿杰特

我在PostgreSQL中有以下两个日期之间的查询。

select generate_series('2019-04-01'::timestamp, '2020-03-31', '1 month') 
         as g_date 

我需要在每个月(即每月15号)中生成特定的日期。以下是我的查询以生成系列

 DO $$
    DECLARE

    compdate date = '2019-04-15';
BEGIN
    CREATE TEMP TABLE tmp_table ON COMMIT DROP AS
      select  *,
                   case
                        when extract('day' from d)  <> extract('day' from compdate)  then 0 
                        when ( extract('month' from d)::int  - extract('month' from compdate)::int ) % 1 = 0 then 1
                        else 0 
                        end as c
          from   generate_series('2019-04-01'::timestamp, '2020-03-31', '1 day') d;

END $$;

SELECT * FROM tmp_table
where c=1;
;

但是,如果输入日期介于(1..29)-04-2019 ..

2019-04-25
2019-05-25
2019-06-25
2019-07-25
2019-08-25
2019-09-25
2019-10-25
2019-11-25
2019-12-25
2020-01-25
2020-02-25
2020-03-25

但如果我给出补偿:31-04-2019或30-04-2019给出投入:

2019-05-31 
2019-07-31 
2019-08-31 
2019-10-31
2019-12-31 
2020-01-31
2020-03-31

预期产量:

 date        flag
2019-04-01     0   ----start_date
2019-04-30     1 
2019-05-31     1
2019-06-30     1
2019-07-31     1
2019-08-31     1
2019-09-30     1
2019-10-31     1
2019-11-30     1
2019-12-31     1
2020-01-31     1
2020-02-29     1
2020-03-31     0  ---end_date

如果在结果中未找到匹配的日期,则应花费该月的最后一天。即,如果在2月中未找到31,则应花费2019年2月29日,并且在4月而不是31的时间应花费2019-04- 30岁 请提出建议。

Belayer

您无法通过generate_series完成所需的操作。这是由于该过程从上一个生成的值开始应用了固定的增量。您的情况1个月。现在,Postgres将成功计算从1个月到下个月的正确月末日期。例如,从1月31日起1个月的收益为2月28日(或29),因为2月31日将是无效日期,因此Postgres会处理该日期。但是,从2月28日开始的相同间隔给出了3月28日的有效日期,因此不需要进行月末调整。从那时起,Generate_Series将在每月的28号返回。同样适用于30天与31天的月份。
但是,通过对同一初始开始日期采用不同的时间间隔,您可以使用递归CTE来达到目标​​。如果结果日期对于该日期无效,则将进行必要的月末调整。执行以下操作:

create or replace function constant_monthly_date
                         ( start_date timestamp
                         , end_date   timestamp
                         ) 
  returns setof date 
  language sql strict
as $$
with recursive date_set as
     (select start_date ds, start_date sd, end_date ed, 1 cnt
      union all
      select (sd + cnt*interval '1 month')  ds, sd, ed, cnt+1 
       from date_set
      where ds<end_date
     )
select ds::date from date_set;    
$$;

-- test
select * from constant_monthly_date(date '2020-01-15', date '2020-12-15' );
select * from constant_monthly_date(date '2020-01-31', date '2020-12-31' );

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Ruby:一个月中特定日期(例如每个月的第一天)在两个日期之间出现的次数

来自分类Dev

如何在固定日期之后的每个月中增加一个整数?

来自分类Dev

如何在PostgreSQL中找到每个月的星期数?

来自分类Dev

在每月的特定日期运行PostgreSQL函数

来自分类Dev

如何在Python中为每个月的特定日期创建日期范围?

来自分类Dev

获取特定日期范围内每个月的行数

来自分类Dev

Postgresql - 如何从每个月的最后一条记录中获取价值

来自分类Dev

如何使用postgresql获取每个月的第三个订单

来自分类Dev

如何从PostgreSQL的特定日期获取特定数据?

来自分类Dev

如何在PostgreSQL中选择特定日期?

来自分类Dev

如何在PostgreSQL中选择特定日期?

来自分类Dev

如何在Python3 Pandas中从每个月中选择最大日期

来自分类Dev

每个月中的月份和日期列表-分为不同的div

来自分类Dev

每个月中有两个日期的天数

来自分类Dev

根据 created_at 日期获取每个月的运行总计

来自分类Dev

从PostgreSQL中的行生成系列

来自分类Dev

从PostgreSQL中的行生成系列

来自分类Dev

如何根据同一月的日期查找一个月中特定日期的第五个或结束日期

来自分类Dev

SQL-如何根据现有数据集中的日期范围为每个月生成行?

来自分类Dev

从过去的每个月中选择数据-MySQL

来自分类Dev

如何计算每个月中值的出现

来自分类Dev

PostgreSQL在日期上加上X个月

来自分类Dev

SQL:查找具有给定日期范围内每个月的数据的记录

来自分类Dev

如何自动为每个月(在特定时间范围之间)生成日期时间字符串以抓取网站?

来自分类Dev

PostgreSQL:选择在一周的特定日期,特定时区发生的行

来自分类Dev

PostgreSQL:选择在一周的特定日期,特定时区发生的行

来自分类Dev

在PostgreSQL中插入系列

来自分类Dev

如何在PostgreSQL中插入日期系列

来自分类Dev

PostgreSQL-使用子查询生成系列

Related 相关文章

  1. 1

    Ruby:一个月中特定日期(例如每个月的第一天)在两个日期之间出现的次数

  2. 2

    如何在固定日期之后的每个月中增加一个整数?

  3. 3

    如何在PostgreSQL中找到每个月的星期数?

  4. 4

    在每月的特定日期运行PostgreSQL函数

  5. 5

    如何在Python中为每个月的特定日期创建日期范围?

  6. 6

    获取特定日期范围内每个月的行数

  7. 7

    Postgresql - 如何从每个月的最后一条记录中获取价值

  8. 8

    如何使用postgresql获取每个月的第三个订单

  9. 9

    如何从PostgreSQL的特定日期获取特定数据?

  10. 10

    如何在PostgreSQL中选择特定日期?

  11. 11

    如何在PostgreSQL中选择特定日期?

  12. 12

    如何在Python3 Pandas中从每个月中选择最大日期

  13. 13

    每个月中的月份和日期列表-分为不同的div

  14. 14

    每个月中有两个日期的天数

  15. 15

    根据 created_at 日期获取每个月的运行总计

  16. 16

    从PostgreSQL中的行生成系列

  17. 17

    从PostgreSQL中的行生成系列

  18. 18

    如何根据同一月的日期查找一个月中特定日期的第五个或结束日期

  19. 19

    SQL-如何根据现有数据集中的日期范围为每个月生成行?

  20. 20

    从过去的每个月中选择数据-MySQL

  21. 21

    如何计算每个月中值的出现

  22. 22

    PostgreSQL在日期上加上X个月

  23. 23

    SQL:查找具有给定日期范围内每个月的数据的记录

  24. 24

    如何自动为每个月(在特定时间范围之间)生成日期时间字符串以抓取网站?

  25. 25

    PostgreSQL:选择在一周的特定日期,特定时区发生的行

  26. 26

    PostgreSQL:选择在一周的特定日期,特定时区发生的行

  27. 27

    在PostgreSQL中插入系列

  28. 28

    如何在PostgreSQL中插入日期系列

  29. 29

    PostgreSQL-使用子查询生成系列

热门标签

归档