MYSQL员工在日期范围内每天的工作时间

MYSQL员工在日期范围内每天的工作时间,mysql,date-range,days,Mysql,Date Range,Days,嗨,我有一个MySQL查询,它查找一个表,该表保存员工每天工作的小时数。我的查询查看日期的当天,结果是我们工作的小时数。假设2015年11月24日是星期二,然后是8号 如何在没有PHP的情况下运行查询以查看日期范围内的每天? 谢谢 编辑 我有一张表格,上面有员工id号(empId),然后是一周中的每一天,周一、周二、周三、周四、周五、周六、周日 -------------------------------------------------------------- | empid |

嗨,我有一个MySQL查询,它查找一个表,该表保存员工每天工作的小时数。我的查询查看日期的当天,结果是我们工作的小时数。假设2015年11月24日是星期二,然后是8号

如何在没有PHP的情况下运行查询以查看日期范围内的每天? 谢谢

编辑

我有一张表格,上面有员工id号(empId),然后是一周中的每一天,周一、周二、周三、周四、周五、周六、周日

--------------------------------------------------------------
| empid   |  Mon  |  Tue  | Wed  |  Thu | Fri  |  Sat | Sun  |
--------------------------------------------------------------
|   1     |   8   |   8   |  0   |   8  |  8   |   8  |   0  |
|   2         0       8   |  8       0  |  8   |   8  |   8  |
--------------------------------------------------------------
因此,员工1在周一、周二、周三、周四、周五、周六和周日的工作时间分别为8小时、8小时和8小时。因此,我试图实现的目标是看看2015-11-24到2015-11-26,看看员工1在两个日期之间工作的时间是多少,根据他们每天工作的时间,周一=8小时轮班周二=8小时轮班周三=0(休息日)周四=8周五=8周六=8周日休息


正如您在演示中所看到的,2015-10-10是星期六,因此empId 1=8小时,empId 2=6小时,empId 3=8小时,那么如何使用日期范围来实现这一点呢?

假设您的表具有以下列:

empId - Employee id
workDate - the date they worked
hoursWorked - the number of hours they worked that day
然后像这样

SELECT empId
   SUM(IF(dayname(workDate) = 'Sunday', hoursWorked, 0)) As Sun,
   SUM(IF(dayname(workDate) = 'Monday', hoursWorked, 0)) As Mon,
   SUM(IF(dayname(workDate) = 'Tuesday', hoursWorked, 0)) As Tues,
   SUM(IF(dayname(workDate) = 'Wednesday', hoursWorked, 0)) As Wed,
   SUM(IF(dayname(workDate) = 'Thursday', hoursWorked, 0)) As Thurs,
   SUM(IF(dayname(workDate) = 'Friday', hoursWorked, 0)) As Fri,
   SUM(IF(dayname(workDate) = 'Saturday', hoursWorked, 0)) As Sat,
FROM employees
GROUP BY empId
WHERE workDate BETWEEN :startDate AND :endDate

别忘了使用准备好的语句来保护自己不受SQL注入的影响

好的,这是一个盲目的尝试,因为您没有向我们提供表雇员的结构。请尝试执行以下操作:

$sql = mysql_query('SELECT * FROM employees WHERE `date` BETWEEN ".$startDate.'" AND "'.$endDate.'"');
while($row=mysql_fetch_assoc($sql)){
    $arr[$row[date]]=$row;
}
$totalHours=0;
for($i=strtotime($startDate);$i<=strtotime($endDate);$i+=86400){
$day=$arr[date('Y-m-d H:i:s',$i];
if($day){
$id=$day[id];
}
$hours=($day)? $day[hours] : 0;
$totalHours+=$hours;
echo "Employee $id Day ".date('D',$i). " Hours $hours";
}
echo "Total hours $totalHours";
$sql=mysql\u query('SELECT*FROM employees,其中'date'介于“$startDate.”和“$endDate.”之间);
while($row=mysql\u fetch\u assoc($sql)){
$arr[$row[日期]]=$row;
}
$totalHours=0;

对于($i=strottime($startDate);$i请尝试此动态透视查询:

SET @sql = NULL;
SELECT empId,
  GROUP_CONCAT(DISTINCT
    CONCAT(case dayname(table_date_field)
                when 'Sunday' then Sun
                when 'Monday' then Mon
                when 'Tuesday' then Tue
                when 'Wednesday' then Wed
                when 'Thursday' then Thu
                when 'Friday' then Fri
                when 'Saturday' then Sat
            else 0 end as hours
    )
  ) INTO @sql
FROM employees;
SET @sql = CONCAT('SELECT empId,', @sql, ' FROM employees GROUP BY empId');

@Rubahmalm有什么想法吗?描述一下员工;我不明白你说的“没有PHP”是什么意思。那里显然有一些PHP?!员工只是员工的id,然后是一周中的每一天,然后是他们每天的工作时间,例如检查日期2015-11-15,然后在我使用PHP运行每一天时,结果是wed=0小时日期范围中的日期,而(strotime($holidayStart))您需要解释丢失日期的部分。您仍然可以使用PHP来执行此操作,而不是暴力攻击糟糕的SQL server。我知道,但忽略它,实际上并不是对此问题造成太大影响(如我所见)这应该可以完成工作。如果有任何问题可以随意提问,那么这个查询肯定不会对您有任何好处。您需要一个日期字段,否则使用此表无法了解员工登录任何时间的日期。工作日期不存储在表中。我要做的是检查两个日期之间的小时数。例如2015-11-24到2015-11-26结果将是empid=1 2015-11-24 Wed'0'2015-11-25 Thu'8'2015-11-26 Fri'8',所以计数将是'16'@Jonathanyong-你能为你的表发布模式吗?这将消除猜测。Petroejie我已经设置了一个小提琴演示我的数据库如何在@Jonathanyong工作-我想我现在明白了,但在o中为了纯粹在MySQL中实现这一点,您需要有一个包含所有可能日期的表。在其他一些数据库中,您可以使用递归CTE避免这种情况,但MySQL没有。Ok Eric正在考虑将数据发送到临时表?
SET @sql = NULL;
SELECT empId,
  GROUP_CONCAT(DISTINCT
    CONCAT(case dayname(table_date_field)
                when 'Sunday' then Sun
                when 'Monday' then Mon
                when 'Tuesday' then Tue
                when 'Wednesday' then Wed
                when 'Thursday' then Thu
                when 'Friday' then Fri
                when 'Saturday' then Sat
            else 0 end as hours
    )
  ) INTO @sql
FROM employees;
SET @sql = CONCAT('SELECT empId,', @sql, ' FROM employees GROUP BY empId');