我正在尝试编写一个MySQL函数,使我能够在规定的时间段内(即1天,1周,1个月等)汇总工作人员完成的工作量。每项工作完成后生成1个ID条目在数据库中。
条目的日期设置为时间戳。
我的问题是我不清楚如何对数据库进行多次调用以检查在设定的时间戳期间创建了多少条目。
以下是数据库表
CREATE TABLE staffwork(
staff_id MEDIUMINT UNSIGNED NOT NULL,
id_of_work_inserted MEDIUMINT UNSIGNED NOT NULL,
job_id MEDIUMINT UNSIGNED NOT NULL,
data_table VARCHAR (65) NOT NULL,
entrytime int(11) NOT NULL,
INDEX message (staff_id)
);
下面的是将数据放入表中的查询,即时间戳:
INSERT INTO staffwork
(staff_id, job_id, id_of_work_inserted, data_table, entrytime )
VALUES ('$staff_id', '$job_id', '$id_of_job', '$data_table', UNIX_TIMESTAMP(now()) )";
以下是我的SQL函数:
function statsForEmployeesWork($ staff_id) { 全球$ dbc;
$select = " SELECT
COUNT(job_id) AS totalWorkDone,
COUNT(job_id) AS oneDaysWorkDone,
COUNT(job_id) AS oneWeekWorkDone,
COUNT(job_id) AS oneMonthWorkDone
";
$from = " FROM
staffwork
";
$where = " WHERE
staff_id = '$staff_id
AND
entrytime >= now() - interval '1 day'
AND
entrytime >= now() - interval '1 week'
AND
entrytime >= now() - interval '1 month '";
$query = $select.$from. $where;
$result = mysqli_query ($dbc, $query)
return $result ;
}
我真的很感激这方面的一些帮助和建议。
答案 0 :(得分:0)
你的入口时间字段是一个int,这意味着你不能使用直接的mysql日期数学,你最终会做像
这样的事情12345678 > '2013-11-14'
这是毫无意义的。将日期范围转换为整数,或将int字段转换为正常日期:
WHERE FROM_UNIXTIME(entrytime) >= now() - interval 1 day
WHERE entrytime >= UNIX_TIMESTAMP(now() - interval 1 day)
更好的是,将输入时间转换为实际的日期时间字段,然后您的原始查询将按预期工作。
答案 1 :(得分:0)
在本条中
entrytime >= now() - interval '1 day'
AND
entrytime >= now() - interval '1 week'
AND
entrytime >= now() - interval '1 month
第一个表达式将丢弃所有超过1天的条目。所以所有的值
COUNT(job_id) AS totalWorkDone,
COUNT(job_id) AS oneDaysWorkDone,
COUNT(job_id) AS oneWeekWorkDone,
COUNT(job_id) AS oneMonthWorkDone
将是相同的。
您应该将查询分开以分别计算每个句点:
<强> totalWorkDone:强>
SELECT
COUNT(job_id) AS totalWorkDone
FROM
staffwork
WHERE
staff_id = $staff_id
<强> oneDaysWorkDone:强>
SELECT
COUNT(job_id) AS oneDaysWorkDone
FROM
staffwork
WHERE
staff_id = $staff_id
AND
entrytime >= now() - interval 1 day
<强> oneWeekWorkDone:强>
SELECT
COUNT(job_id) AS oneWeekWorkDone
FROM
staffwork
WHERE
staff_id = $staff_id
AND
entrytime >= now() - interval 1 week
<强> oneMonthWorkDone:强>
SELECT
COUNT(job_id) AS oneMonthWorkDone
FROM
staffwork
WHERE
staff_id = $staff_id
AND
entrytime >= now() - interval 1 month
当然会将entrytime
转换为datetime
字段