问题描述
我有一个训练计划,例如每周 3 次 - 周一、周三、周五。我需要为我的日程表生成记录,其中的日期是我接受培训的当年年底。
日程表是:
CREATE TABLE trainingSchedule (
id NUMBER,training_date DATE
);
如果培训日期已经存在 - 不要插入记录。
解决方法
这是一种选择。阅读代码中的注释。
SQL> CREATE TABLE trainingSchedule
2 (id NUMBER,3 training_date DATE
4 );
Table created.
SQL> create sequence seq_tra;
Sequence created.
SQL> -- initial insert (just to show that MERGE will skip it
SQL> insert into trainingschedule values (seq_tra.nextval,date '2021-03-22');
1 row created.
MERGE
将跳过已经插入的行。我知道您只想插入今天日期之后的日期;如果不是这样,只需删除最后一个条件。
SQL> merge into trainingschedule t
2 using (-- this is a calendar for current year
3 select trunc(sysdate,'yyyy') + level - 1 datum
4 from dual
5 connect by level <= add_months(trunc(sysdate,'yyyy'),12) - trunc(sysdate,'yyyy')
6 ) c
7 on (c.datum = t.training_date)
8 when not matched then insert (id,training_date) values (seq_tra.nextval,c.datum)
9 -- insert only Mondays,Wednesdays and Fridays
10 where to_char(c.datum,'dy','nls_date_language = english') in ('mon','wed','fri')
11 -- insert only dates that follow today's date ("till the end of the current year")
12 and datum >= trunc(sysdate);
122 rows merged.
SQL>
里面有什么?
SQL> select id,2 to_char(training_date,'dd.mm.yyyy,dy','nls_date_language = english') tr_date
3 from trainingschedule
4 order by training_date;
ID TR_DATE
---------- ------------------------
1 22.03.2021,mon --> see? No duplicates
311 24.03.2021,wed
309 26.03.2021,fri
207 29.03.2021,mon
354 31.03.2021,wed
321 02.04.2021,fri
<skip>