Pergunta

I'm working with two datasets, one is a more detailed view of clock punch activity, and another is a summation of entire "shifts" that these clock punches make up. What we are trying to accomplish, is to return a record where the PAYCODEID is equal to '7' or '8' (these are meal break codes), and if it falls within the range of the last two columns in the entire shift table just below:

ClockEventShifts:

ShiftID EMPID       Clockin                 MealRangeMax
1       00001280687 2014-02-16 08:00:00.000 2014-02-16 14:00:00.000
6       00001280687 2014-02-17 16:00:00.000 2014-02-17 22:00:00.000

There are a few key possibilities for the more detailed view of clock punches:

ClockEvent A:

EVENTID EMPID       CLOCKIN                 CLOCKOUT                PAYCODEID
228     00001280687 2014-02-16 08:00:00.000 2014-02-16 12:00:00.000 20
234     00001280687 2014-02-16 12:00:00.000 2014-02-16 13:00:00.000 8
235     00001280687 2014-02-16 13:00:00.000 2014-02-16 16:00:00.000 20
237     00001280687 2014-02-16 16:00:00.000 2014-02-16 17:01:00.000 21
238     00001280687 2014-02-16 17:01:00.000 2014-02-16 18:00:00.000 20
236     00001280687 2014-02-17 16:00:00.000 2014-02-17 17:00:00.000 20

ClockEvent B:

EVENTID EMPID       CLOCKIN                 CLOCKOUT                PAYCODEID
228     00001280687 2014-02-16 08:00:00.000 2014-02-16 12:00:00.000 20
234     00001280687 2014-02-16 12:00:00.000 2014-02-16 13:00:00.000 21
235     00001280687 2014-02-16 13:00:00.000 2014-02-16 16:00:00.000 20
237     00001280687 2014-02-16 16:00:00.000 2014-02-16 17:01:00.000 8
238     00001280687 2014-02-16 17:01:00.000 2014-02-16 18:00:00.000 20
236     00001280687 2014-02-17 16:00:00.000 2014-02-17 17:00:00.000 20

ClockEvent C:

EVENTID EMPID       CLOCKIN                 CLOCKOUT                PAYCODEID
228     00001280687 2014-02-16 08:00:00.000 2014-02-16 12:00:00.000 20
234     00001280687 2014-02-16 12:00:00.000 2014-02-16 13:00:00.000 21
235     00001280687 2014-02-16 13:00:00.000 2014-02-16 16:00:00.000 20
237     00001280687 2014-02-16 16:00:00.000 2014-02-16 17:01:00.000 21
238     00001280687 2014-02-16 17:01:00.000 2014-02-16 18:00:00.000 20
236     00001280687 2014-02-17 16:00:00.000 2014-02-17 17:00:00.000 20

ClockEvent D:

EVENTID EMPID       CLOCKIN                 CLOCKOUT                PAYCODEID
228     00001280687 2014-02-16 08:00:00.000 2014-02-16 12:00:00.000 20
234     00001280687 2014-02-16 12:00:00.000 2014-02-16 13:00:00.000 8
235     00001280687 2014-02-16 13:00:00.000 2014-02-16 16:00:00.000 20
237     00001280687 2014-02-16 16:00:00.000 2014-02-16 17:01:00.000 8
238     00001280687 2014-02-16 17:01:00.000 2014-02-16 18:00:00.000 20
236     00001280687 2014-02-17 16:00:00.000 2014-02-17 17:00:00.000 20

ClockEvent E:

EVENTID EMPID       CLOCKIN                 CLOCKOUT                PAYCODEID
228     00001280687 2014-02-16 08:00:00.000 2014-02-16 12:00:00.000 8
234     00001280687 2014-02-16 12:00:00.000 2014-02-16 13:00:00.000 21
235     00001280687 2014-02-16 13:00:00.000 2014-02-16 16:00:00.000 8
237     00001280687 2014-02-16 16:00:00.000 2014-02-16 17:01:00.000 21
238     00001280687 2014-02-16 17:01:00.000 2014-02-16 18:00:00.000 20
236     00001280687 2014-02-17 16:00:00.000 2014-02-17 17:00:00.000 20

Ideally, a perfect query/sproc could return the following in each scenario, checking for punches 360 minutes out:

A:

EVENTID EMPID       CLOCKIN                 CLOCKOUT                PAYCODEID
234     00001280687 2014-02-16 12:00:00.000 2014-02-16 13:00:00.000 8

B:

Nada!

C:

Nada!

D:

EVENTID EMPID       CLOCKIN                 CLOCKOUT                PAYCODEID
234     00001280687 2014-02-16 12:00:00.000 2014-02-16 13:00:00.000 8

E (it could return multiples too, but I really only care about the existence of at least one meal before 6 hours):

EVENTID EMPID       CLOCKIN                 CLOCKOUT                PAYCODEID
228     00001280687 2014-02-16 08:00:00.000 2014-02-16 12:00:00.000 8

It could also do something like this, ignoring that MealRangeMax piece and just using Clockin from ClockEventShifts:

A:

MINUTE_DIFFERENCE
240

B:

MINUTE_DIFFERENCE
600

C:

MINUTE_DIFFERENCE
NULL

D:

MINUTE_DIFFERENCE
240
600 (optional)

E:

MINUTE_DIFFERENCE
0
300 (optional)

I would tend to use something like IN or BETWEEN for such things, but IN can't check the values between things though to my knowledge, and BETWEEN can only check against an X and Y value to my knowledge, but I need to continue those BETWEEN checks for the rest of the result set from ClockEventShifts. I'm still searching for some solutions, but this seems to be slightly more complex.

Does anyone have any advice or ideas in approaching this problem?

Foi útil?

Solução

This sql statement will give you records from CLOCKEVENT where the paycode is 7 or 8 and the event occurs within ClockEventShifts clockin time and mealrangemax.

SELECT   ce.*
  FROM ClockEvent ce
  , ClockEventShifts ces
  WHERE ce.PAYCODEID IN(7, 8)
    AND ce.EMPID     = ces.EMPID
    AND ce.CLOCKIN  >= ces.CLOCKIN
    AND ce.CLOCKOUT <= ces.MealRangeMax

If you only care about the ClockIn time being within the ClockEventShift range of time, you could use this:

SELECT   ce.*
  FROM ClockEvent ce
  , ClockEventShifts ces
  WHERE ce.PAYCODEID IN(7, 8)
    AND ce.EMPID     = ces.EMPID
    AND ce.CLOCKIN   BETWEEN ces.CLOCKIN AND ces.MealRangeMax
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top