PostgreSQL存储过程——实现多级时间截取及中文日期格式化

一、效果展示

select timeselect('year,hour,month,quarter', '2021-01-01 12:10:05');

结果:2021年第1季度01月12时

二、需求说明

        针对日期时间型字段使用的函数,函数中可以截取多级时间级,参数的数量可变,截取选中的级别,截取之后进行拼接。如:TIMESELECT(‘month’,’day’,’hour’,[呼叫中心:通话开始时间],将通话开始时间截取出月份、天、小时,再最后拼接起来。

【页面说明】

  1. 用法:TIMESELECT(‘参数1,参数2,…’,时间字段)

  2. 说明:截取该日期时间字段部分时间作为统计维度,时间类型包括year, quarter, month, week, day, hour, halfhour, minute, second。可多选,截取之后的各级时间将会按照从大到小的单位拼接

  3. 示例:TIMESELECT(‘month,day,hour’,[呼叫中心:通话开始时间])表示通话开始时间以月+日+小时的维度来截取

【注意事项】

  1. 现有的单级时间截取函数会将截取之后的字段拼接一个单位,如截取‘hour’会自动在最后拼接’时’,截取‘day’会自动在最后拼接’日’。本字段按同样的逻辑在每级后追加单位,然后把各级拼接起来

  2. 参数可选:’year’ ‘quarter’ ’month’ ‘week’ ‘day’ ‘hour’ ‘halfhour’ ‘minute’ ‘second’

  3. 不管参数的顺序如何,最后拼接的时候统一从前到后:最大一级到最小一级(从年到秒)

三、存储过程

-- 查询:select timeselect('year,hour,month,quarter', '2021-01-01 12:10:05');
-- 输出:2021年第1季度01月12时

create function timeselect(date_types text, date_from timestamp without time zone) returns character varying
    language plpgsql
as
$$
DECLARE
    DECLARE
    RESULT           VARCHAR(50);
    temp_text_month  VARCHAR(5);
    temp_text_week   VARCHAR(5);
    temp_text_day    VARCHAR(5);
    temp_text_hour   VARCHAR(5);
    temp_text_minute VARCHAR(5);
    temp_text_second VARCHAR(5);
    date_type        text[];
BEGIN
    date_type = string_to_array(date_types, ',');
    IF date_type @> ARRAY ['year'] THEN
        RESULT = concat(RESULT, EXTRACT(YEAR FROM date_from) || '年');
    END IF;

    IF date_type = ARRAY ['quarter'] THEN
        RESULT = concat(RESULT, '第' || EXTRACT(quarter FROM date_from) || '季度');
    END IF;

    IF date_type = ARRAY ['month'] THEN
        temp_text_month = EXTRACT(MONTH FROM date_from);
        IF (LENGTH(temp_text_month) = 1) THEN
            RESULT = concat(RESULT, '0' || temp_text_month || '月');
        ELSE
            RESULT = concat(RESULT, temp_text_month || '月');

        END IF;
    END IF;

    IF date_type @> ARRAY ['week'] THEN
        temp_text_week = EXTRACT(WEEK FROM date_from);
        IF
            (LENGTH(temp_text_week) = 1) THEN
            RESULT = concat(RESULT, '第0' || temp_text_week || '周');
        ELSE
            RESULT = concat(RESULT, '第' || temp_text_week || '周');

        END IF;
    END IF;

    IF date_type @> ARRAY ['day'] THEN
        temp_text_day = EXTRACT(DAY FROM date_from);
        IF
            (LENGTH(temp_text_day) = 1) THEN
            RESULT = concat(RESULT, '0' || temp_text_day || '日');
        ELSE
            RESULT = temp_text_day || '日';

        END IF;
    END IF;

    IF date_type @> ARRAY ['hour'] THEN
        temp_text_hour = EXTRACT(HOUR FROM date_from);
        IF
            (LENGTH(temp_text_hour) = 1) THEN
            RESULT = concat(RESULT, '0' || temp_text_hour || '时');
        ELSE
            RESULT = concat(RESULT, temp_text_hour || '时');

        END IF;
    END IF;

    IF date_type @> ARRAY ['halfhour'] THEN
        temp_text_hour = EXTRACT(HOUR FROM date_from);
        IF
            (LENGTH(temp_text_hour) = 1) THEN
            temp_text_hour = '0' || temp_text_hour;
        ELSE
            temp_text_hour = temp_text_hour;

        END IF;
        temp_text_minute = EXTRACT(MINUTE FROM date_from);
        IF
            temp_text_minute :: int4 >= 30 THEN
            RESULT = concat(RESULT, temp_text_hour || '时30分');
        ELSE
            RESULT = concat(RESULT, temp_text_hour || '时00分');

        END IF;
    END IF;

    IF date_type @> ARRAY ['minute'] THEN
        temp_text_minute = EXTRACT(MINUTE FROM date_from);
        IF
            (LENGTH(temp_text_minute) = 1) THEN
            RESULT = concat(RESULT, '0' || temp_text_minute || '分');
        ELSE
            RESULT = concat(RESULT, '' || temp_text_minute || '分');

        END IF;
    END IF;

    IF date_type @> ARRAY ['second'] THEN
        temp_text_second = EXTRACT(SECOND FROM date_from);
        IF
            (LENGTH(temp_text_second) = 1) THEN
            RESULT = concat(RESULT, '0' || temp_text_second || '秒');
        ELSE
            RESULT = concat(RESULT, '' || temp_text_second || '秒');

        END IF;
    END IF;

    RETURN RESULT;

END;
$$;

    原文作者:Thinking_H
    原文地址: https://blog.csdn.net/u010953816/article/details/120173908
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞