MySQL - 每个月的DATE_ADD月间隔

时间:2013-12-08 09:00:16

标签: mysql sql datetime

我在下面写了一个函数来给我一个员工在特定30天内完成的工作数量(表中'工作栏中的每个ID代表1个工作)。

如果我只想回顾4周,该功能正常工作。然而问题是我希望计数从每个月初开始。例如,如果某人在2013年12月10日查看记录,我需要记录显示12月的所有工作(但不包括前30天的记录)。

以下是我的功能:

 $interval_1month = 'interval 4 WEEK';

function statsHowMuchWorkDoneByStaff ($staff_id, $timeInterval)
    {
        global $dbc;

    $select = " SELECT 
                    COUNT(job_id) AS totalnumberWork ";

    $from   = " FROM 
                staffwork 
                    ";

     $where = " WHERE
                        staff_id = $staff_id
                    AND  
                        FROM_UNIXTIME(entrytime) >= now() -  $timeInterval";    

    $query  = $select.$from. $where;

    $result = mysqli_query ($dbc, $query)
                 or trigger_error("Query:  $query\n<br />MySQL Error: " . mysqli_error($dbc));     

    if(mysqli_num_rows($result))
        {
           $row = mysqli_fetch_array ($result, MYSQLI_ASSOC);

           $result  = safe_output($row['totalnumbernewcontacts']) ;

           return $result ; 
        }
        else
        {
           return false; 
        }
    }

非常感谢任何有关如何进行的建议。

更新:这是我的数据表:

CREATE TABLE staffwork(
staff_id 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) 

); 

1 个答案:

答案 0 :(得分:1)

如果我理解正确并且您希望通过提供该月份的任何日期作为参数来计算特定月份的COUNT(job_id),那么您可以这样做

SELECT COUNT(job_id) total
  FROM staffwork
 WHERE staff_id = 1
   AND entrytime >= UNIX_TIMESTAMP(LAST_DAY('2013-12-10') + INTERVAL 1 DAY - INTERVAL 1 MONTH)
   AND entrytime <  UNIX_TIMESTAMP(LAST_DAY('2013-12-10') + INTERVAL 1 DAY)

注意:此查询是索引友好的,因为它不会将entrytime转换为datetime,而是将范围值(这是查询的常量)转换为unix时间。 确保您拥有entrytimestaff_id 的索引,以便能够利用它。

这是 SQLFiddle 演示


当你在考虑时,请考虑学习并使用prepared statements而不是插入查询字符串,使代码容易受到sql注入。

据说你的php函数可能看起来像这样

function statsWorkDoneByStaffMember($staff_id, $month) {
    global $dbc;

    $sql = "
    SELECT COUNT(job_id) total
      FROM staffwork
     WHERE staff_id = ?
       AND entrytime >= UNIX_TIMESTAMP(LAST_DAY(?) + INTERVAL 1 DAY - INTERVAL 1 MONTH)
       AND entrytime <  UNIX_TIMESTAMP(LAST_DAY(?) + INTERVAL 1 DAY)
    ";

    $stmt = $dbc->prepare($sql);
    if (!$stmt) {
        trigger_error('Prepare failed: ' . $dbc->error); 
    }
    $stmt->bind_param('iss', $staff_id, $month, $month);
    if(!$stmt->execute()) {
        trigger_error('Execute failed: ' . $dbc->error);
    }
    $stmt->bind_result($result);
    $stmt->fetch();
    $stmt->close();

    return $result;
} 

样本用法:

$dbc = new mysqli('localhost', 'user', 'password', 'dbname');
$staff_id = 1;

//Get the number of job_id for the current month
$total = statsWorkDoneByStaffMember($staff_id, date('Y-m-d'));

//Get the number of job_id for a specific month
$total = statsWorkDoneByStaffMember($staff_id, '2013-07-01');