2013-11-15 86 views
0

我正在嘗試編寫一個MySQL函數,這個函數將使我能夠聚集工作人員在設定的時間段內完成的工作量,例如1天,1周,1個月等。每項工作都會在數據庫中生成一個ID條目。MySql組在同一個查詢中的多個時間戳查詢

條目的日期被設置爲時間戳。

我的問題是,我不清楚我將如何去調用數據庫來檢查在一個設定的時間戳期間有多少個條目。

下面是數據庫表

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 statsForEmployees工作($ staff_id) { global $ 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

你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爲實際的日期時間字段,然後按預期的原始查詢會工作。

+0

你好馬克·B,非常感謝你的回覆。我有點困惑,爲什麼你在查詢中做了兩個WHERE線索。你能解釋一下嗎?謝謝你的協助 – andreea115

+0

只是你可以去的兩種方式的例子。假裝他們是「這樣或這種方式」 –

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

+0

你好claustrofob,謝謝你的答覆。我不清楚。然後我做3個獨立的SQL函數來獲取數據。 2.您如何將輸入時間轉換爲日期時間字段。我該如何去做這件事 – andreea115