我正在寻找一种方法,将下面的emp_attendance行下面的分组为MON-SUN周。
我在互联网上看到了一些有关“ IW”格式的信息,但我认为这不能允许我进行分组,也许是我做错了。另外,应该将诸如12312020星期四和01012021星期五之类的日期归为一组,因为它们介于星期一和星期日之间,但它们是不同的年份。
我当前的代码是对所有数据求和并产生以下输出
select e.employee_id,
e.first_name,
e.last_name,
trunc(sum(a.end_date - a.start_date) * 24) hours,
trunc(mod(sum(a.end_date - a.start_date) * 24 * 60,60)) minutes,
round(mod(sum(a.end_date - a.start_date) * 24 * 60 * 60,60)) seconds
from employees e, emp_attendance a
where a.employee_id = e.employee_id
group by e.employee_id,
e.first_name, e.last_name
order by e.employee_id,
e.first_name,
e.last_name;
EMPLOYEE_ID FIRST_NAME
LAST_NAME HOURS
MINUTES SECONDS
1 John Doe 128 51 19
我希望产生此输出。请注意,对于该组中的每一行,我都需要使用SAME group_id,并且在该组的MONDAY需要一个start_date,在该组的周日需要end_date,以便在需要时可以追溯数据的来源。
如果没有员工的emp_attendance记录,请不要添加空行。在我的示例中,虽然存在员工2和3,但他们没有任何输出。
感谢所有回答
GROUP_ID
EMPLOYEE_ID FIRST_NAME
LAST_NAME HOURS MINUTES SECONDS.
START_DATE END_DATE
1 1 John Doe 46 0 58 07202020 07262020
2 1 John Doe 73 37 14 07272020 08022020
3 1 John Doe 9 13 7 08032020 08082020
ALTER SESSION SET NLS_DATE_FORMAT = 'MMDDYYYY HH24:MI:SS';
Create table employees(
employee_id Number(6),
first_name VARCHAR2(20),
last_name VARCHAR2(20),
hourly_rate NUMBER
);
INSERT INTO employees(
employee_id,
first_name,
last_name,
hourly_rate)
VALUES
(1, 'John', 'Doe', 55.05);
INSERT INTO employees(
employee_id,
first_name,
last_name,
hourly_rate)
VALUES
(2, 'Jane', 'Smith', 45.50);
INSERT INTO employees(
employee_id,
first_name,
last_name,
hourly_rate)
VALUES
(3, 'Mike', 'Jones', 25.00);
create table emp_attendance(
employee_id NUMBER(6),
start_date DATE,
end_date DATE
);
INSERT INTO emp_attendance(
employee_id,
start_date,
end_date)
VALUES
(1,
TO_DATE('08032020 12:12:12', 'MMDDYYYY HH24:MI:SS'),
TO_DATE('08032020 21:25:19', 'MMDDYYYY HH24:MI:SS'));
INSERT INTO emp_attendance(
employee_id,
start_date,
end_date)
VALUES
(1,
TO_DATE('08022020 12:12:12', 'MMDDYYYY HH24:MI:SS'),
TO_DATE('08032020 19:25:19', 'MMDDYYYY HH24:MI:SS'));
INSERT INTO emp_attendance(
employee_id,
start_date,
end_date)
VALUES
(1,
TO_DATE('07212020 07:22:22', 'MMDDYYYY HH24:MI:SS'),
TO_DATE('07212020 14:49:13', 'MMDDYYYY HH24:MI:SS'));
INSERT INTO emp_attendance(
employee_id,
start_date,
end_date)
VALUES
(1,
TO_DATE('07222020 08:08:43', 'MMDDYYYY HH24:MI:SS'),
TO_DATE('07222020 16:15:55', 'MMDDYYYY HH24:MI:SS'));
INSERT INTO emp_attendance(
employee_id,
start_date,
end_date)
VALUES
(1,
TO_DATE('07232020 08:18:17', 'MMDDYYYY HH24:MI:SS'),
TO_DATE('07232020 15:58:16', 'MMDDYYYY HH24:MI:SS'));
INSERT INTO emp_attendance(
employee_id,
start_date,
end_date)
VALUES
(1,
TO_DATE('07242020 10:50:15', 'MMDDYYYY HH24:MI:SS'),
TO_DATE('07242020 18:21:41', 'MMDDYYYY HH24:MI:SS'));
INSERT INTO emp_attendance(
employee_id,
start_date,
end_date)
VALUES
(1,
TO_DATE('07252020 18:06:11', 'MMDDYYYY HH24:MI:SS'),
TO_DATE('07262020 01:34:37', 'MMDDYYYY HH24:MI:SS'));
INSERT INTO emp_attendance(
employee_id,
start_date,
end_date)
VALUES
(1,
TO_DATE('07262020 10:57:07', 'MMDDYYYY HH24:MI:SS'),
TO_DATE('07262020 18:44:11', 'MMDDYYYY HH24:MI:SS'));
INSERT INTO emp_attendance(
employee_id,
start_date,
end_date)
VALUES
(1,
TO_DATE('07272020 09:35:44', 'MMDDYYYY HH24:MI:SS'),
TO_DATE('07272020 16:14:13', 'MMDDYYYY HH24:MI:SS'));
INSERT INTO emp_attendance(
employee_id,
start_date,
end_date)
VALUES
(1,
TO_DATE('07282020 07:08:31', 'MMDDYYYY HH24:MI:SS'),
TO_DATE('07282020 17:17:12', 'MMDDYYYY HH24:MI:SS'));
INSERT INTO emp_attendance(
employee_id,
start_date,
end_date)
VALUES
(1,
TO_DATE('07292020 05:38:27', 'MMDDYYYY HH24:MI:SS'),
TO_DATE('07292020 13:06:49', 'MMDDYYYY HH24:MI:SS'));
INSERT INTO emp_attendance(
employee_id,
start_date,
end_date)
VALUES
(1,
TO_DATE('07302020 08:11:51', 'MMDDYYYY HH24:MI:SS'),
TO_DATE('07302020 18:29:40', 'MMDDYYYY HH24:MI:SS'));
INSERT INTO emp_attendance(
employee_id,
start_date,
end_date)
VALUES
(1,
TO_DATE('07312020 18:01:51', 'MMDDYYYY HH24:MI:SS'),
TO_DATE('08012020 01:52:37', 'MMDDYYYY HH24:MI:SS'));
答案 0 :(得分:2)
在上面的数据库结构中,您可以在表中使用start_date列 emp_attendance计算当前星期数,然后根据其进行分组。
您可以将附加参数与取整功能一起使用 舍入(column_name,round_num) 在第二个参数中使用负值
-1表示舍入到10s
-2表示舍入到100s
-3表示舍入到1000s
以此类推...
查询应类似于以下内容:
select to_char(a.start_date, 'WW') weekNumber, e.employee_id, e.first_name, e.last_name,
trunc(sum(a.end_date - a.start_date) * 24) hours,
trunc(mod(sum(a.end_date - a.start_date) * 24 * 60,60)) minutes,
round(mod(sum(a.end_date - a.start_date) * 24 * 60,60), -1) rounded_minutes,
round(mod(sum(a.end_date - a.start_date) * 24 * 60 * 60,60)) seconds
from employees e, emp_attendance a
where a.employee_id = e.employee_id
group by e.employee_id, e.first_name, e.last_name ,to_char(a.start_date, 'WW')
-- order by first column = weekNumber then by other columns
order by 1, e.employee_id, e.first_name, e.last_name;
答案 1 :(得分:1)
有很多主题相似的帖子,因此我将在链接时将它们链接->
答案 2 :(得分:1)
您可以使用the trunc()
function和ISO周'IW' element来获得星期一的一周;然后根据该字段以及您的其他字段进行分组:
select e.employee_id,
e.first_name,
e.last_name,
trunc(a.start_date, 'IW') as week,
trunc(sum(a.end_date - a.start_date) * 24) hours,
trunc(mod(sum(a.end_date - a.start_date) * 24 * 60,60)) minutes,
round(mod(sum(a.end_date - a.start_date) * 24 * 60 * 60,60)) seconds
from employees e
join emp_attendance a on a.employee_id = e.employee_id
group by e.employee_id, e.first_name, e.last_name, trunc(a.start_date, 'IW')
order by e.employee_id, e.first_name, e.last_name, trunc(a.start_date, 'IW');
EMPLOYEE_ID | FIRST_NAME | LAST_NAME | WEEK | HOURS | MINUTES | SECONDS
----------: | :--------- | :-------- | :---------------- | ----: | ------: | ------:
1 | John | Doe | 07202020 00:00:00 | 46 | 0 | 58
1 | John | Doe | 07272020 00:00:00 | 73 | 37 | 14
1 | John | Doe | 08032020 00:00:00 | 9 | 13 | 7
要获得所需的输出,您可以操纵该截断的日期,并为组ID添加row_number()
:
select row_number() over (order by trunc(a.start_date, 'IW')) as group_id,
e.employee_id,
e.first_name,
e.last_name,
trunc(sum(a.end_date - a.start_date) * 24) hours,
trunc(mod(sum(a.end_date - a.start_date) * 24 * 60,60)) minutes,
round(mod(sum(a.end_date - a.start_date) * 24 * 60 * 60,60)) seconds,
to_char(trunc(a.start_date, 'IW'), 'MMDDYYYY') as start_date,
to_char(trunc(a.start_date, 'IW') + 6, 'MMDDYYYY') as end_date
from employees e
join emp_attendance a on a.employee_id = e.employee_id
group by e.employee_id, e.first_name, e.last_name, trunc(a.start_date, 'IW')
order by e.employee_id, e.first_name, e.last_name;
GROUP_ID | EMPLOYEE_ID | FIRST_NAME | LAST_NAME | HOURS | MINUTES | SECONDS | START_DATE | END_DATE
-------: | ----------: | :--------- | :-------- | ----: | ------: | ------: | :--------- | :-------
1 | 1 | John | Doe | 46 | 0 | 58 | 07202020 | 07262020
3 | 1 | John | Doe | 9 | 13 | 7 | 08032020 | 08092020
2 | 1 | John | Doe | 73 | 37 | 14 | 07272020 | 08022020
db<>fiddle用于当前数据;和for the original data。