PostgreSQL中带有日期的generate_series()中的“ yyyy”错误值“(202)无效”

时间:2019-05-22 12:24:39

标签: sql postgresql

我正在尝试根据当前日期生成动态日期。我想使用generate_series()填充开始日期和结束日期之间的日期(间隔= 1天)。

  • 如果当前日期早于10/1,则开始日期为上一年的10/1
  • 如果当前日期在10/1之后,则开始日期为当年的10/1
  • 结束日期是第4年的9/30。例如,

  • 当前日期= 5/22/2019->开始日期= 10/1/2018,结束日期= 9/30/2021
  • 当前日期= 11/1/2019->开始日期= 10/1/2019,结束日期= 9/30/2022
  • select generate_series(
    to_date(cast(start_date as text), 'yyyy-mm-dd'), 
    to_date(concat(extract(year from to_date(cast(start_date as text), 'yyyy-mm-dd')+3),'-','09','-', 30), 'yyyy-mm-dd'),
    '1 day'
    ) 
    from (
        select case 
        when extract(month from current_date) <= 10 then concat(extract(year from current_date) -1,'-',10,'-', '01') 
        when extract(month from current_date) > 10 then  concat(extract(year from current_date),'-',10,'-', '01')
        end) as start_date
    

    错误:“ yyyy”的值“((202)”无效
    详细信息:值必须是整数。
    SQL状态:22007

    它抱怨年份不是整数。我需要修改哪些部分才能运行此查询?

    1 个答案:

    答案 0 :(得分:0)

    select case
              when date_trunc('month', current_date) ::date < make_date(extract(year from current_date) ::int, 10, 1) then
               generate_series(make_date((extract(year from current_date) - 1) ::int, 10, 1)
                              ,make_date((extract(year from current_date) + 2) ::int, 10, 1) - 1
                              ,'1 day') ::date
              else
               generate_series(make_date(extract(year from current_date) ::int, 10, 1)
                              ,make_date((extract(year from current_date) + 3) ::int, 10, 1) - 1
                              ,'1 day') ::date
           end as dt;
    

    您可以在以下位置使用current_date代替:current_date => '11 / 1/2019':: date或'05 / 22/2019':: date