在postgresql中,如何根据日期为日期赋值?

tzdcorbm  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(303)

我正在使用postgresql,希望创建一个函数并在同一个查询中使用它。我要创建的函数应该与下面的python函数执行相同的操作:

def get_season(dia):

    season = (abs(dia.year) % 100) + (1 if dia.strftime('%m-%d') >= '10-01' else 0)
    return season

给定datetime,函数返回年份的最后两位,如果日期大于10月1日,则返回前一位加1,例如:
输入= '2017-3-5' ->输出= 17 输入= '2019-11-1' ->输出= 20 问题是我不知道在postgresql中用什么函数来实现这一点。
目前,我使用以下代码,但抛出错误:

CREATE FUNCTION get_season(dia, datetime) RETURNS integer AS $$
    BEGIN
    MOD(EXTRACT(year FROM dia), 100) + 
    CASE WHEN EXTRACT(MONTH FROM dia) >= 10 THEN 1 ELSE 0 END;
    END $$
    LANGUAGE PLPGSQL;

    SELECT date_column, get_season(date_column)
    FROM my_table

错误抛出为: (psycopg2.errors.UndefinedObject) dia type doesn't exist

polhcujo

polhcujo1#

以下操作应做到这一点:

create or replace function get_season(p_input date) 
  returns integer
as
$$
  select case 
           when extract(month from p_input) > 9 then extract(year from p_input)::int + 1
           else extract(year from p_input)::int 
         end % 100
$$
language sql
immutable;

条件 extract(month from p_input) > 9 检查日期是在10月还是更晚,并返回下一年的值。
不过,我强烈建议不要使用两位数的年份。

ijnw1ujt

ijnw1ujt2#

postgres extract函数将提取部分日期,因此我可以想象您可以这样做:

MOD(EXTRACT(year FROM yourdate), 100) + 
CASE WHEN EXTRACT(month FROM yourdate) > 9 THEN 1 ELSE 0 END

第一个获取两位数的日期,第二个获取0或1以根据月份进行添加
聚苯乙烯;我不确定我是否会将这样一个函数称为“get\u season”,一年有四个季节等等-也许是“get\u academic\u year”,但我确定这完全是上下文关系。。只是一个不知情的第三方看到“季节”这个词时的假设

相关问题