【问题标题】:MySql group multiple timestamp queries in the same queryMySql 在同一个查询中分组多个时间戳查询
【发布时间】:2013-11-29 01:53:09
【问题描述】:

我正在尝试编写一个 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 函数:

函数 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 ; 
} 

我非常感谢您对此的帮助和建议。

【问题讨论】:

    标签: mysql datetime unix-timestamp


    【解决方案1】:

    你的 entrytime 字段是一个 int,这意味着你不能直接使用 mysql 日期数学,你最终会做类似的事情

    12345678 > '2013-11-14'
    

    这是没有意义的。将您的日期范围转换为整数,或将您的 int 字段转换为普通日期:

    WHERE FROM_UNIXTIME(entrytime) >= now() - interval 1 day
    WHERE entrytime >= UNIX_TIMESTAMP(now() - interval 1 day)
    

    更好的是,将 entrytime 转换为实际的 datetime 字段,然后您的原始查询将按预期工作。

    【讨论】:

    • 你好 Marc B,非常感谢你的回复。我有点困惑为什么你在查询中做了两个 WHERE 子句。你能解释一下吗。感谢您的热心帮助
    • 只是您可以采用的两种方式的示例。假装他们是“这样或这样”
    【解决方案2】:

    在这个子句中

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

    【讨论】:

    • 您好,claustrofob,谢谢您的回复。我不清楚。然后我做 3 个单独的 SQL 函数来获取数据。 2.你是什么意思将entrytime转换为datetime字段。我该怎么做呢
    猜你喜欢
    • 2015-02-12
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多