在Zend Framework中选择上个月的所有记录?

时间:2011-03-08 11:18:22

标签: php mysql zend-framework datetime

我的项目要求很少:

我想要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
.....................

在此,我想fetch records previous month particular client Zend Framework. client 1 1,2,3 and 5.

例如:如果我想要{{1}}条记录,那么它应该向我显示记录:{{1}}

请建议一些代码或链接,以帮助我......

提前致谢

5 个答案:

答案 0 :(得分:3)

假设日期列是DateTime column,我会尝试使用类似

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

注意:未经测试且可能需要调整,但这是一般方向

这将从tablename中获取所有行,其中月份是最后一个月,而year是当前年份,而clientId是选定的clientId。所以查询应该变成类似

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

您还可以将上个月和当前年度的计算直接放入查询中,例如:使用appropriate MySql functions代替用PHP计算它们。这可能更可靠。

答案 1 :(得分: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'

组成

答案 2 :(得分:1)

如果您的date字段属于Datetime类型,则可以使用MySQL中的日期特定功能来执行此操作。使用数据库函数时,只需使用Zend_Db_Expr构造语句。

答案 3 :(得分: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)

答案 4 :(得分:0)

您可以使用SQL DATE_SUB和INTERVAL函数,如:

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

在ZF1中,您可以编写如下内容:

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