一、效果展示
select timeselect('year,hour,month,quarter', '2021-01-01 12:10:05');
结果:2021年第1季度01月12时
二、需求说明
针对日期时间型字段使用的函数,函数中可以截取多级时间级,参数的数量可变,截取选中的级别,截取之后进行拼接。如:TIMESELECT(‘month’,’day’,’hour’,[呼叫中心:通话开始时间],将通话开始时间截取出月份、天、小时,再最后拼接起来。
【页面说明】
用法:TIMESELECT(‘参数1,参数2,…’,时间字段)
说明:截取该日期时间字段部分时间作为统计维度,时间类型包括year, quarter, month, week, day, hour, halfhour, minute, second。可多选,截取之后的各级时间将会按照从大到小的单位拼接
示例:TIMESELECT(‘month,day,hour’,[呼叫中心:通话开始时间])表示通话开始时间以月+日+小时的维度来截取
【注意事项】
现有的单级时间截取函数会将截取之后的字段拼接一个单位,如截取‘hour’会自动在最后拼接’时’,截取‘day’会自动在最后拼接’日’。本字段按同样的逻辑在每级后追加单位,然后把各级拼接起来
参数可选:’year’ ‘quarter’ ’month’ ‘week’ ‘day’ ‘hour’ ‘halfhour’ ‘minute’ ‘second’
不管参数的顺序如何,最后拼接的时候统一从前到后:最大一级到最小一级(从年到秒)
三、存储过程
-- 查询: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;
$$;