Oracle 11g
我需要提出一个查询,该查询应该返回在给定日期过去10个星期四至少工作3个星期四的员工。
作为示例如果今天(2015年6月18日)运行查询它应该查找最后10个星期四并返回员工ID,如果该员工至少在3个星期四工作。
EmployeeID Date Clock In Time Clock Out Time
EMPLOYE A 14-may-2015 8am 4pm
EMPLOYE A 15-may-2015 8am 4pm
EMPLOYE A 16-may-2015 8am 4pm
EMPLOYE A 17-may-2015 8am 4pm
EMPLOYE A 1-jun-2015 8am 4pm
EMPLOYE A 2-jun-2015 8am 4pm
EMPLOYE A 4-jun-2015 8am 4pm
EMPLOYE A 11-jun-2015 8am 4pm
EMPLOYE A 12-jun-2015 8am 4pm
EMPLOYE A 14-jun-2015 8am 4pm
EMPLOYE A 15-jun-2015 8am 4pm
EMPLOYE A 16-jun-2015 8am 4pm
EMPLOYE A 17-jun-2015 8am 4pm
EMPLOYEE B 16-may-2015 8am 4pm
EMPLOYEE B 17-may-2015 8am 4pm
EMPLOYEE B 1-jun-2015 8am 4pm
EMPLOYEE B 2-jun-2015 8am 4pm
EMPLOYEE B 4-jun-2015 8am 4pm
EMPLOYEE B 5-jun-2015 8am 4pm
EMPLOYEE B 6-jun-2015 8am 4pm
EMPLOYEE B 7-jun-2015 8am 4pm
EMPLOYEE B 8-jun-2015 8am 4pm
EMPLOYEE B 10-jun-2015 8am 4pm
EMPLOYEE B 11-jun-2015 8am 4pm
答案 0 :(得分:1)
以下查询为您提供日期
select to_char(to_date('23.06.2008', 'dd.mm.yyyy'), 'Day') from dual
将其select表达式添加到query select子句并将其命名为Day Column。然后在where子句中使用它,例如Day ='Thursdays'
答案 1 :(得分:1)
在Oracle中,您可以使用
select count(*) from tablename where to_char(date, 'd') = *X*
其中x是星期四的数字,基于1-7周的一天(可能是4或5)。根据您所在的地区,您的一周可能会在不同的一天开始,因此请务必进行验证。
答案 2 :(得分:1)
使用to_char(date,'DAY')
功能获取日期名称。这比获取当天的数字要好,因为根据您的nls设置,日期可能会有不同的编号。
Select employeeID, count(*) as 'THURSDAYS_WORKED'
where date >= trunc(sysdate) - 70 --get last 10 weeks
and UPPER(to_char(date, 'DAY')) == 'THURSDAY' --get all thursdays
group by employeeID
having count(*) >= 3 --get only those employees who worked 3 or more thursdays
答案 3 :(得分:1)
https!
我认为您不想排除当前日期,因此您需要严格使用大于(而不是大于或等于),这样您就不会在当前情况下意外计算太多天数日期是星期四。我只是假设这个方法来自另一个答案是获得一周中某一天的正确方法,但你总是需要小心你的语言环境/区域的设置。此外,没有理由进行内联视图,因为您可以使用select EmployeeID
from T
where Date > sysdate() - 70 days and to_char(Date, 'd') = '4'
group by EmployeeID
having count(*) >= 3
轻松完成相同的结果。