postgresql日程排程函数的编写实例

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: postgresql日程排程函数的编写实例

postgresql日程排程函数的编写实例

此函数用于《云杉树成长管理器软件》。

一、函数功能

此函数是根据任务(成长任务,课程)、指定期间(学期)、任务主体(学生)、每周排程字符串信息(周几第几节等)信息,将日程排至每一天的具体时段。同时要考虑节假日及补休处理。

二、参数说明

学员名称。 期间名称。 任务名称。 每周日程。

函数执行代码:

select e9_lcrwpc('小明','22-23第一学期','语文','week1:上午2,week5:上午2,week3:上午3,week2:上午4,week4:上午4,week1:下午2')

三、使用到的表

(1)成长任务表(课程表,包括课程内容和要求等):

e9czrw字段列表:
id          int4          32      编号              textedit          
oid         varchar      30     任务编号          textedit          
rwmc        varchar     100   任务名称          textedit          
rwnr        varchar    1000   任务内容          buttontextedit          
rwyq        varchar    1000   任务要求          buttontextedit          
jhwj        varchar     300   任务文件          fileedit          
rwsc        numeric      12     计划时数          textedit      0.00
xmmc        varchar      60     项目计划          buttonedit          
czys        varchar      20     成长要素          textread          
tsxx        varchar     100   提示信息          textedit          
xzss        bool          0     限制时数          checkedit         
rclb        varchar      20     日程类别          comboedit         
sfsh        bool          0     是否审核          checkedit         
shry        varchar      20     审核人员          textedit          
sfql        bool          0     是否清理          checkedit         
bhjr        bool          0     假日排程          checkedit    

(2)学员期间设置表(包含期间的开始结束时间等信息)

e9zrqjfw字段列表:
id        int4        32                    编号  textedit                      
czzt        varchar     30                  成长学员  listedit          edit        
qjxh        int4        32                  期间序号  textedit                      
qjmc        varchar     100                 期间名称  textedit                      
ksrq        date        0                     开始日期  dateedit          yyyy-MM-dd  
jsrq        date        0                     截止日期  dateedit          yyyy-MM-dd  
xjks        varchar     4                   夏季开始(月日)  textedit          0000        
xjjs      varchar     4                   夏季结束(月日)  textedit          0000        
qjsm        varchar     60                  期间说明  textedit                      
bqzs        int4        32                  本期周数  textread                      
bqts        int4        32                  本期天数  textread                      
fzds        varchar     40                          textedit                      
sfsh        bool        0                     是否审核  checkedit                     
shry        varchar     40                  审核人员  textedit                      
sdfl        varchar     20                  时间表版本 listedit     

(3)年度假日表

e9mljr字段列表:
id            int4        32                  编号  textedit                      
nd          bpchar      4                       年度  textedit                      
jrxh        int4        32                  假日序号  textedit          ##          
jrmc        varchar     20                  假日名称  textedit                      
xxrq        date        0                     休息日期  dateedit          yyyy-MM-dd  
xxrqxq      varchar     20                休息日期星期几 textread                      
sfbx        bool        0                     是否补休  checkedit                     
bxrq        date        0                     补休日期  dateedit          yyyy-MM-dd  
bxrqxq      varchar     20                补休日期星期几 textread                      
sfsh        bool        0                     是否审核  checkedit                     
shry        varchar     40                  审核人员  textread    

(4)每日时段表(课时表,第几节从几点到几点…)

e9mrsd字段列表:
id        int4        32                    编号  textedit                      
sdfl        varchar     100                 时段版本  textedit                      
sdxh        int4        32                  时段序号  textedit                      
sdmc        varchar     60                  时段名称  textedit                      
kssj        varchar     5                 冬季开始时间  textedit                      
jssj      varchar     5                 冬季结束时间  textedit                      
sdsc        varchar     5                   冬季时长  textread          0:00        
kssj1       varchar     5                 夏季开始时间  textedit                      
jssj1       varchar     5                 夏季结束时间  textedit                      
sdsc1       varchar     5                   夏季时长  textread          0:00        
sdsm        varchar     200                 时段说明  textedit                      
sfsh        bool        0                   是否审核  checkedit                     
shry        varchar     20                  审核人员  textedit                      
fkmc        varchar     10                  时块名称  comboedit         edit     

(5)日程表(排程结果表,包含每天的日程)

e9rcb字段列表:
id          int4        32                    编号  textedit                      
qjmc      varchar     100                 期间名称  textedit                      
rq          date        0                     日期  textedit          yyyy-MM-dd  
week      int4        32                    星期  textedit                      
xmmc        varchar     60                  项目计划  buttonedit                    
czys        varchar     20                  成长要素  textread                      
sdxh        int4        32                    序号  buttonedit                    
sdmc        varchar     60                    时段  textedit                      
kssj        bpchar      5                     开始  textedit          00:00       
jssj        bpchar      5                     结束  textedit          00:00       
rwsc        bpchar      5                   任务时长  textedit          hh:mm       
rwss        int4        32                  任务时数  textedit                      
rwbh        varchar     20                  任务编号  buttonedit        edit        
rwmc        varchar     100                 任务名称  textedit                      
rclb        varchar     40                  日程类别  comboboxedit      edit        
rczq        varchar     60                  日期周期  textedit                      
sftx        bool        0                   是否提醒  checkedit                     
tsxx        varchar     100                 提示信息  textedit                      
rcyh        varchar     60                  日程用户  checkedcomboboxedit             
fzmc        varchar     60                  分组名称  textedit                      
pcyh        varchar     400                 排除用户  textread                      
wcbl        int4        32                  完成比率  spinedit          0至10        
rczz        varchar     100                 日程排定  textedit                      
wcqk        varchar     100                 完成情况  textedit                      
sfsh        bool        0                   是否审核  checkedit                     
shry        varchar     20                  审核人员  textedit                      
sfqx        bool        0                   已经取消  checkread                     
sfql        bool        0                   是否清理  checkedit       

四、函数代码

CREATE OR REPLACE FUNCTION public.e9_lcrwpc(
  sszt character varying,
  ssqj character varying,
  ssrwmc character varying,
  ssmzrc character varying)
    RETURNS character varying
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE PARALLEL UNSAFE
AS $BODY$
DECLARE
  ssxjks varchar(4);ssxjjs varchar(4);  -- 夏季开始,夏季结束;
  ssrclb varchar(20);sssdmc varchar(20);ssmzxq integer;
  ssid int2;ssrwmc varchar(50);ssxmmc varchar(30);ssczys varchar(10);
  ssrwsc numeric(12,2);sspcsc numeric(12,2);sssxsc numeric(12,2);
  sssxzq varchar(10);sssdsc varchar(5);
  ssmyrq int;ssdayweek int;sstsxx varchar(50);
  ssdqdate date;ssksdate date;ssjzdate date;ssxxrq date;ssbxrq date;  -- 休息日期、补休日期
  ssrczz varchar(50);ssxzss bool;ssbhjr bool;
  sssdxh int;sskssj char(5);ssjssj char(5);
  ssrcid int;ssrc varchar(50);
  ssrwss numeric(12,2);
  sssdfl varchar(20);
BEGIN
  ssrclb:='';
  SELECT rwmc,xmmc,czys,tsxx,xzss,bhjr,rwsc * 60::numeric(12,2) 
      INTO ssrwmc,ssxmmc,ssczys,sstsxx,ssxzss,ssbhjr,ssrwsc
    FROM e9czrw WHERE rwmc = $3;
  SELECT  ksrq,jsrq,xjks,xjjs,sdfl INTO ssksdate,ssjzdate,ssxjks,ssxjjs,sssdfl 
    FROM e9zrqjfw WHERE czzt = $1 AND qjmc = $2 and sfsh=true;
  sspcsc := 0.00;
  DROP TABLE If Exists sstbrc;
  CREATE TEMP TABLE sstbrc(id int,xq int,sd varchar(20),sfpd bool);
  INSERT INTO sstbrc (id,sd,sfpd)
    SELECT row_number() over() AS id,unnest AS sd,FALSE AS sfpd
      FROM unnest(string_to_array($4, ',')) ;
  UPDATE sstbrc SET xq = (replace(split_part(sd,':',1),'week',''))::int2,sd = split_part(sd,':',2);
  UPDATE sstbrc set xq = 0 where xq= 7 ;
  ssdqdate:=ssksdate;
  LOOP
    EXIT WHEN ssjzdate < ssdqdate;
    ssmzxq:=extract(dow FROM ssdqdate);
    IF exists(SELECT xq FROM sstbrc WHERE xq = ssmzxq) THEN
      LOOP
        EXIT WHEN NOT exists(SELECT sd FROM sstbrc WHERE xq = ssmzxq AND sfpd = FALSE);
        SELECT  id,sd INTO ssrcid,sssdmc  FROM sstbrc WHERE xq = ssmzxq AND sfpd = FALSE ORDER BY id LIMIT 1;
        ssxxrq:=NULL;
        SELECT  xxrq,bxrq INTO ssxxrq,ssbxrq  FROM e9mljr WHERE xxrq = ssdqdate;
        --不是休息日
        IF (ssxxrq IS NULL) THEN
          IF NOT exists(SELECT sdmc FROM e9rcb WHERE qjmc = $2 AND sdmc = sssdmc 
              AND rcyh = $1 AND rq = ssdqdate) THEN
            IF to_char(ssdqdate,'mmdd') BETWEEN ssxjks AND ssxjjs  THEN
              SELECT  sdxh,kssj1,jssj1,sdsc1 INTO sssdxh,sskssj,ssjssj,sssdsc
                FROM e9mrsd WHERE sdfl = sssdfl AND sdmc = sssdmc;
            ELSE
              SELECT  sdxh,kssj,jssj,sdsc INTO sssdxh,sskssj,ssjssj,sssdsc
                FROM e9mrsd WHERE sdfl = sssdfl AND sdmc = sssdmc;
            END IF;
            sssxsc:=e9_scss(sssdsc);
            IF ssjssj > sskssj AND (ssxzss = false OR ssrwsc > (sspcsc + sssxsc-15)) THEN
              INSERT INTO e9rcb (rq,week,qjmc,xmmc,czys,sdxh,sdmc,kssj,jssj,
                rwsc,rwss,rwmc,rclb,tsxx,rcyh,sdfl)
                VALUES (ssdqdate,ssmzxq,$2,ssxmmc,ssczys,sssdxh,sssdmc,sskssj,ssjssj,
                  sssdsc,sssxsc,ssrwmc,ssrclb,sstsxx,$1,sssdfl);
              sspcsc:=sspcsc + sssxsc;
            END IF;
          END IF;
        ELSE
          --休息日
          IF not(ssbxrq IS NULL) AND (ssbxrq BETWEEN ssksdate AND ssjzdate)  THEN
            IF NOT exists(SELECT sdmc FROM e9rcb WHERE qjmc = $2 AND sdmc = sssdmc 
                AND rcyh = $1 AND rq = ssbxrq) THEN
              IF to_char(ssbxrq,'mmdd') BETWEEN ssxjks AND ssxjjs  THEN
                SELECT  sdxh,kssj1,jssj1,sdsc1 INTO sssdxh,sskssj,ssjssj,sssdsc
                  FROM e9mrsd WHERE sdfl = sssdfl AND sdmc = sssdmc;
              ELSE
                SELECT  sdxh,kssj,jssj,sdsc INTO sssdxh,sskssj,ssjssj,sssdsc
                  FROM e9mrsd WHERE sdfl = sssdfl AND sdmc = sssdmc;
              END IF;
              sssxsc:=e9_scss(sssdsc);
              IF ssjssj > sskssj AND (ssxzss = false OR ssrwsc > (sspcsc + sssxsc-15)) THEN
                INSERT INTO e9rcb (rq,week,qjmc,xmmc,czys,sdxh,sdmc,kssj,jssj,
                    rwsc,rwss,rwmc,rclb,tsxx,rcyh,sdfl)
                  VALUES (ssbxrq,extract(dow FROM ssbxrq),
                      $2,ssxmmc,ssczys,sssdxh,sssdmc,sskssj,ssjssj,
                      sssdsc,sssxsc,ssrwmc,ssrclb,sstsxx,$1,sssdfl);
                sspcsc:=sspcsc + sssxsc;
              END IF;
            END IF;
          END IF;
        END IF;
        UPDATE sstbrc SET sfpd = TRUE WHERE id = ssrcid;
      END LOOP;
    END IF;
    ssdqdate :=ssdqdate+1 ;
    UPDATE sstbrc SET sfpd = FALSE;
  END LOOP;
  DROP TABLE If Exists sstbrc;
  RETURN '';
END;
$BODY$;
ALTER FUNCTION public.e9_lcrwpc(character varying, character varying, character varying, character varying)
    OWNER TO postgres;

五、总结

本例为日程排程的一种尝试,可以结合《云杉树成长管理器》软件进行了解,后台代码完成开放,谨供参考。

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
1月前
|
关系型数据库 Serverless 定位技术
PostgreSQL GIS函数判断两条线有交点的函数是什么?
PostgreSQL GIS函数判断两条线有交点的函数是什么?
143 60
|
2月前
|
SQL 自然语言处理 关系型数据库
在 PostgreSQL 中使用 `REPLACE` 函数
【8月更文挑战第8天】
680 9
在 PostgreSQL 中使用 `REPLACE` 函数
|
1月前
|
SQL 关系型数据库 C语言
PostgreSQL SQL扩展 ---- C语言函数(三)
可以用C(或者与C兼容,比如C++)语言编写用户自定义函数(User-defined functions)。这些函数被编译到动态可加载目标文件(也称为共享库)中并被守护进程加载到服务中。“C语言函数”与“内部函数”的区别就在于动态加载这个特性,二者的实际编码约定本质上是相同的(因此,标准的内部函数库为用户自定义C语言函数提供了丰富的示例代码)
|
2月前
|
关系型数据库 PostgreSQL
PostgreSQL的null值函数
【8月更文挑战第20天】PostgreSQL的null值函数
61 3
|
2月前
|
SQL 关系型数据库 MySQL
SQL Server、MySQL、PostgreSQL:主流数据库SQL语法异同比较——深入探讨数据类型、分页查询、表创建与数据插入、函数和索引等关键语法差异,为跨数据库开发提供实用指导
【8月更文挑战第31天】SQL Server、MySQL和PostgreSQL是当今最流行的关系型数据库管理系统,均使用SQL作为查询语言,但在语法和功能实现上存在差异。本文将比较它们在数据类型、分页查询、创建和插入数据以及函数和索引等方面的异同,帮助开发者更好地理解和使用这些数据库。尽管它们共用SQL语言,但每个系统都有独特的语法规则,了解这些差异有助于提升开发效率和项目成功率。
228 0
|
3月前
|
关系型数据库 BI 数据处理
|
3月前
|
SQL Oracle 关系型数据库
|
4月前
|
JSON 关系型数据库 数据库
PostgreSQL中json_to_record函数的神秘面纱
`json_to_record`是PostgreSQL中的函数,用于将JSON数据转换为RECORD类型,便于查询和分析。基本用法是传入JSON数据,如`SELECT json_to_record(&#39;{&quot;name&quot;: &quot;张三&quot;, &quot;age&quot;: 30}&#39;::json);`。还可结合FUNCTION创建自定义函数,实现复杂功能。在实际应用中,它简化了对JSON格式数据的处理,例如筛选年龄大于30的用户。了解并善用此函数能提升数据库操作效率。本文由木头左分享,期待你的点赞和收藏,下次见!
PostgreSQL中json_to_record函数的神秘面纱
|
4月前
|
SQL 关系型数据库 数据库
PostgreSQL 常用函数分享
PostgreSQL 常用函数分享
37 0
|
关系型数据库 分布式数据库 PolarDB
《阿里云产品手册2022-2023 版》——PolarDB for PostgreSQL
《阿里云产品手册2022-2023 版》——PolarDB for PostgreSQL
355 0