SQL查询计算过去10周内工作的星期四数

时间:2015-06-19 02:59:55

标签: sql oracle

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 
  • 在上述数据集中,员工A在三个星期四工作(14/4/11) 有效的员工。
  • 员工B仅在两个星期四(4和11)工作 - 员工无效:不应退回 我尝试在Oracle中使用NEXT_DAY函数,但无法真正提出逻辑。更重要的是,我不想让我的sql混乱,因为它使得它变得比它需要的更复杂。

4 个答案:

答案 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 轻松完成相同的结果。