2011-03-08 37 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)');