MySql组在同一查询中进行多个时间戳查询

时间:2013-11-15 15:49:55

标签: mysql datetime unix-timestamp

我正在尝试编写一个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 ; 
} 

我真的很感激这方面的一些帮助和建议。

2 个答案:

答案 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字段