2011-03-08 42 views
2

我已經在我的項目一個小要求:在Zend Framework中選擇上個月的所有記錄?

我想fetch all the records of the previous month from the database.

structure of the table如下:

id clientid  task date  
1 1   1  01.Feb.2011 12:13 
2 1   1  05.Feb.2011 15:22 
3 1   0  09.Feb.2011 14:17 
4 2   1  11.Feb.2011 19:53 
5 1   0  19.Feb.2011 14:27 
6 2   1  23.Feb.2011 09:53 
7 1   0  01.Mar.2011 14:17 
8 2   1  01.Mar.2011 19:53 
9 1   0  03.Mar.2011 14:67 
10 2   1  03.Mar.2011 09:53 
..................... 

在這裏,我想fetchprevious month一個particular client的所有recordsZend Framework.

例如:如果我想要client 1個記錄然後它應該顯示我的記錄:1,2,3 and 5.

請推薦一些代碼或鏈接,可以幫助我......

在此先感謝

回答

3

假設日期列是一個DateTime column,我會的東西嘗試像

$select->from('tablename') 
     ->where('MONTH(date) = ?', date('n', strtotime('last month'))) 
     ->where('YEAR(date) = ?', date('Y')) 
     ->where('clientid = ?', $clientId) 
; 

注:未經測試,可能需要調整,但它的大方向

這從獲取的所有行tablename,其中月份是最後一個月,年份是當前年份,並且您的clientId是所選的clientId。因此,查詢應該成爲像

SELECT * from tablename 
    WHERE MONTH(date) = 2 
     AND YEAR(date) = 2011 
     AND clientid = 1; 

你也可以把上個月和當年的計算直接進入查詢,例如使用appropriate MySql functions代替用PHP計算它們。這可能更可靠。

2

你可以得到當前的第一天月使用PHP:

$this_month = mktime(0, 0, 0, date("m"), 1, date("Y")); 
$previous_month = mktime(0, 0, 0, date("m")-1, 1, date("Y")); 

然後你只需通過這個日期作爲查詢參數:

SELECT * FROM mytable WHERE date >= ? AND date < ? and client_id = 1 

你在哪裏替換?分別由'$ previous_month'和'$ this_month'

+0

這也會返回超過1個月前的記錄。 – Htbaa 2011-03-08 11:27:34

+0

很好,你編輯了你的回覆。這看起來更好。 – Htbaa 2011-03-08 12:34:04

1

如果您的date字段的類型爲Datetime,您可以使用MySQL中的日期特定函數來執行此操作。使用數據庫功能時,只需使用Zend_Db_Expr即可構建您的對帳單。

1

我Zend_Db的技能有點生疏,但我認爲下面你想要做什麼:

$select->from('tablename') 
      ->where(new Zend_Db_Expr('MONTH(`date`) = MONTH(DATE_SUB(NOW(), INTERVAL 1 MONTH))')) 
      ->where(new Zend_Db_Expr('YEAR(`date`) = IF(MONTH(NOW()) = 1, YEAR(NOW()) - 1, YEAR(NOW()))')) 
      ->where('clientid = ?', $clientId) 
0

你可以使用SQL DATE_SUB和類似區間函數:

select * from table where `date` >= DATE_SUB(NOW(), INTERVAL 1 month) 

在ZF1可以寫如下:

$select->from('tablename') 
->where('date >= DATE_SUB(NOW(), INTERVAL 1 month)');