【发布时间】:2022-11-26 05:25:45
【问题描述】:
我们使用双月工资单,员工在每月的第 15 天和最后几天收到工资。
如果这些日子是周六、周日或节假日,那么我们会在之前的最后一天收到工资,那一天不是周六、周日或节假日。
例如,以本周为例,4 月 15 日是星期五,但它被定义为假期,因此应在 4 月 14 日星期四向人们付款。
我设法得到一个部分查询,我可以在其中排除周末和节假日,但我可以使用一些帮助来确定应该在什么日期向人们付款。我的输出应该只包括发薪日。我想为当年的 1 月到 12 月生产年产量。
我在想,一旦假期和周末被排除在外,这个月的最后一个发薪日可能是 last_day() 吗?
CREATE OR REPLACE FUNCTION gen_dates(i_from_date IN DATE, i_end_date IN DATE, i_min_delta IN NUMBER, i_max_delta IN NUMBER, i_num_rows IN NUMBER)
RETURN VARCHAR2
SQL_MACRO
IS
BEGIN
RETURN q'{
SELECT start_date, end_date
FROM (
SELECT pivot_date AS start_date, pivot_date + NUMTODSINTERVAL( i_min_delta + (i_max_delta-i_min_delta) * DBMS_RANDOM.VALUE(), 'hour') AS end_date
FROM (
SELECT pivot_date + DBMS_RANDOM.VALUE() AS pivot_date
FROM (
SELECT rownum AS rn, pivot_date AS pivot_date FROM (
SELECT TRUNC(i_from_date)+level-1 AS pivot_date FROM DUAL
CONNECT BY TRUNC(i_from_date)+level-1<=TRUNC(i_end_date)
)
)
CONNECT BY LEVEL <= i_num_rows AND PRIOR rn = rn AND PRIOR sys_guid() IS NOT NULL
)
)
}' ;
END;
/
create table holidays(
holiday_date DATE not null,
holiday_name VARCHAR2(20),
constraint holidays_pk primary key (holiday_date),
constraint is_midnight check ( holiday_date = trunc ( holiday_date ) )
);
INSERT into holidays (HOLIDAY_DATE,HOLIDAY_NAME)
WITH dts as (
select to_date('15-APR-2022 00:00:00','DD-MON-YYYY HH24:MI:SS'), 'Passover 2022' from dual union all
select to_date('31-DEC-2022 00:00:00','DD-MON-YYYY HH24:MI:SS'), 'New Year Eve 2022' from dual
)
SELECT * from dts;
SELECT
c.dt,
to_char(c.dt, 'DY') as dow
FROM generate_dates(
TIMESTAMP '2022-01-01 00:00:00',
TIMESTAMP '2022-04-30 00:00:00',
1, 'DAY') c
where
to_char(c.dt, 'DY') NOT IN ('SAT', 'SUN')
AND NOT EXISTS (
SELECT 1
FROM holidays h
WHERE c.dt = h.holiday_date
);
【问题讨论】: