Problem with a Case statement
Posted: Fri Aug 08, 2014 4:13 am
I am trying to run a query of employee hours any day of the week and get the same results.
The query works but the Case statement does not. Anyone have any ideas as to why this wont work?
Thanks
drtmz
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/*Time Card Summary*/
CASE daterun
WHEN DAYOFWEEK(Curdate()) = 1 /*Sunday*/
SET @FromDate=(Now()- interval 14 day) , @ToDate=(Now()- interval 1 day);
WHEN DAYOFWEEK(Curdate()) = 2 /*Monday*/
SET @FromDate=(Now()- interval 15 day) , @ToDate=(Now()- interval 1 day);
WHEN DAYOFWEEK(Curdate()) = 3 /*Tuesday*/
SET @FromDate=(Now()- interval 16 day) , @ToDate=(Now()- interval 2 day);
WHEN DAYOFWEEK(Curdate()) = 4 /*Wednesday*/
SET @FromDate=(Now()- interval 17 day) , @ToDate=(Now()- interval 3 day);
WHEN DAYOFWEEK(Curdate()) = 5 /*Thursday*/
SET @FromDate=(Now()- interval 18 day) , @ToDate=(Now()- interval 4 day);
WHEN DAYOFWEEK(Curdate()) = 6 /*Friday*/
SET @FromDate=(Now()- interval 19 day) , @ToDate=(Now()- interval 5 day);
ELSE
SET @FromDate=(Now()- interval 20 day) , @ToDate=(Now()- interval 6 day);
ENDCASE;
/*This section works great*/
SELECT e.FName,e.LName,
FORMAT(SUM(TIME_TO_SEC(IF((TIME_TO_SEC(TimeDisplayed2)>0 AND c.ClockStatus IN(0,1)), TIMEDIFF(TimeDisplayed2, TimeDisplayed1),0)))/3600,2) AS RawHours,
FORMAT(
(IFNULL((SELECT SUM(TIME_TO_SEC(ta.RegHours)) FROM timeadjust ta WHERE ta.EmployeeNum=e.EmployeeNum AND DATE(ta.TimeEntry) BETWEEN @FromDate AND @ToDate),0) /*adj reg hours*/ +
IFNULL((SELECT SUM(TIME_TO_SEC(ta.OTimeHours)) FROM timeadjust ta WHERE ta.EmployeeNum=e.EmployeeNum AND DATE(ta.TimeEntry) BETWEEN @FromDate AND @ToDate),0) /*adj OT hours*/ +
SUM(TIME_TO_SEC(IF(c.ClockStatus IN(0,1),IF(c.AdjustIsOverRidden, c.Adjust, c.AdjustAuto),0))))/3600
,2) AS AdHours,
FORMAT((IFNULL((SELECT SUM(TIME_TO_SEC(ta.RegHours)) FROM timeadjust ta WHERE ta.EmployeeNum =e.EmployeeNum AND DATE(ta.TimeEntry) BETWEEN @FromDate AND @ToDate),0) /*adj reg hours*/ +
SUM(TIME_TO_SEC(IF((TIME_TO_SEC(c.TimeDisplayed2)>0 AND c.ClockStatus IN(0,1)), TIMEDIFF(c.TimeDisplayed2, c.TimeDisplayed1),0)))+
SUM(TIME_TO_SEC(IF(c.ClockStatus IN(0,1),IF(c.AdjustIsOverRidden, c.Adjust, c.AdjustAuto),0)))- /*minus (+) adjustments*/
SUM(TIME_TO_SEC(IF(c.ClockStatus IN(0,1) AND c.OTimeHours<>'-01:00:00', c.OTimeHours,0)))- /*minus Overtime*/
SUM(TIME_TO_SEC(IF(c.ClockStatus IN(0,1) , c.OTimeAuto,0))))/3600,2) AS RegHours /*minus Overtime Auto*/
FROM employee e
INNER JOIN clockEvent c ON c.EmployeeNum=e.EmployeeNum
WHERE (DATE(c.TimeDisplayed1) BETWEEN @FromDate AND @ToDate)
AND LName <> " "
GROUP BY c.EmployeeNum;
The query works but the Case statement does not. Anyone have any ideas as to why this wont work?
Thanks
drtmz
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/*Time Card Summary*/
CASE daterun
WHEN DAYOFWEEK(Curdate()) = 1 /*Sunday*/
SET @FromDate=(Now()- interval 14 day) , @ToDate=(Now()- interval 1 day);
WHEN DAYOFWEEK(Curdate()) = 2 /*Monday*/
SET @FromDate=(Now()- interval 15 day) , @ToDate=(Now()- interval 1 day);
WHEN DAYOFWEEK(Curdate()) = 3 /*Tuesday*/
SET @FromDate=(Now()- interval 16 day) , @ToDate=(Now()- interval 2 day);
WHEN DAYOFWEEK(Curdate()) = 4 /*Wednesday*/
SET @FromDate=(Now()- interval 17 day) , @ToDate=(Now()- interval 3 day);
WHEN DAYOFWEEK(Curdate()) = 5 /*Thursday*/
SET @FromDate=(Now()- interval 18 day) , @ToDate=(Now()- interval 4 day);
WHEN DAYOFWEEK(Curdate()) = 6 /*Friday*/
SET @FromDate=(Now()- interval 19 day) , @ToDate=(Now()- interval 5 day);
ELSE
SET @FromDate=(Now()- interval 20 day) , @ToDate=(Now()- interval 6 day);
ENDCASE;
/*This section works great*/
SELECT e.FName,e.LName,
FORMAT(SUM(TIME_TO_SEC(IF((TIME_TO_SEC(TimeDisplayed2)>0 AND c.ClockStatus IN(0,1)), TIMEDIFF(TimeDisplayed2, TimeDisplayed1),0)))/3600,2) AS RawHours,
FORMAT(
(IFNULL((SELECT SUM(TIME_TO_SEC(ta.RegHours)) FROM timeadjust ta WHERE ta.EmployeeNum=e.EmployeeNum AND DATE(ta.TimeEntry) BETWEEN @FromDate AND @ToDate),0) /*adj reg hours*/ +
IFNULL((SELECT SUM(TIME_TO_SEC(ta.OTimeHours)) FROM timeadjust ta WHERE ta.EmployeeNum=e.EmployeeNum AND DATE(ta.TimeEntry) BETWEEN @FromDate AND @ToDate),0) /*adj OT hours*/ +
SUM(TIME_TO_SEC(IF(c.ClockStatus IN(0,1),IF(c.AdjustIsOverRidden, c.Adjust, c.AdjustAuto),0))))/3600
,2) AS AdHours,
FORMAT((IFNULL((SELECT SUM(TIME_TO_SEC(ta.RegHours)) FROM timeadjust ta WHERE ta.EmployeeNum =e.EmployeeNum AND DATE(ta.TimeEntry) BETWEEN @FromDate AND @ToDate),0) /*adj reg hours*/ +
SUM(TIME_TO_SEC(IF((TIME_TO_SEC(c.TimeDisplayed2)>0 AND c.ClockStatus IN(0,1)), TIMEDIFF(c.TimeDisplayed2, c.TimeDisplayed1),0)))+
SUM(TIME_TO_SEC(IF(c.ClockStatus IN(0,1),IF(c.AdjustIsOverRidden, c.Adjust, c.AdjustAuto),0)))- /*minus (+) adjustments*/
SUM(TIME_TO_SEC(IF(c.ClockStatus IN(0,1) AND c.OTimeHours<>'-01:00:00', c.OTimeHours,0)))- /*minus Overtime*/
SUM(TIME_TO_SEC(IF(c.ClockStatus IN(0,1) , c.OTimeAuto,0))))/3600,2) AS RegHours /*minus Overtime Auto*/
FROM employee e
INNER JOIN clockEvent c ON c.EmployeeNum=e.EmployeeNum
WHERE (DATE(c.TimeDisplayed1) BETWEEN @FromDate AND @ToDate)
AND LName <> " "
GROUP BY c.EmployeeNum;