2013-05-16 40 views
1

我实现时间在Zend框架跟踪系统,如何为Zend框架设置Mysql查询的格式?

在,我有以下的Zend的查询来实现:

SELECT 
    u_id, 
    SEC_TO_TIME(SUM(CASE WHEN TotalTime > 32400 
         THEN TotalTime - 28800 
         ELSE 0 END)) as OverTime, 
    SEC_TO_TIME(SUM(TotalTime)) AS TotalTime 
FROM 
(
    SELECT 
    u_id, insert_date, 
    SUM(TIME_TO_SEC(CASE WHEN endtime IS NULL 
         THEN timediff(starttime, starttime) 
         ELSE timediff(endtime, starttime) 
         END)) AS TotalTime 
    FROM 
    logmaster 
    WHERE 
    project_id IS NOT NULL 
    AND logmaster.u_id =1028 
    AND insert_date >('2013-04-01') AND insert_date <('2013-04-31') 
    GROUP BY U_ID,insert_date 
) AS A 

哪位能给我输出是这样的:

u_id OverTime TotalTime 
------------------------------------- 
1028 03:53:58 105:16:20 

现在我的问题是我必须在zend框架中实现此查询,因为我已经这样试过:

public function gettotallog() 
{    
    $sql=$this->select() 
      ->setIntegrityCheck(false) 
      ->from(array('u'=>'logmaster'),array('id','project_id','u_id','insert_date', 
        "SEC_TO_TIME(SUM(CASE WHEN TotalTime > 32400 
        THEN TotalTime - 28800 
        ELSE 0 
        END)) as OverTime , SEC_TO_TIME(SUM(TotalTime)) AS TotalTime 
        FROM 
        (
        SUM(TIME_TO_SEC(
        CASE WHEN endtime IS NULL 
        THEN timediff(starttime, starttime) 
        ELSE timediff(endtime, starttime) 
        END)) AS TotalTime      
        ) AS A" 

       )) 
      ->joinleft(array('a'=>'projectmaster'), 'u.project_id = a.id', array('pname'=>'name')) 
      ->join(array('i'=>'usermaster'),'u.u_id=i.id',array('uname'=>'name')) 
      ->where("u.insert_date >='$yr-$mh-1' AND u.insert_date <='$yr-$mh-31'")  
      ->where("u.project_id!='NULL'")  
      ->where("u.u_id='$uid'") 
      ->where('u.is_delete=false') 
      ->group('u.u_id'); 
     $resultSet = $this->fetchAll($sql);      
     return $resultSet; 
} 

但它显示的错误是这样的:

异常信息:

消息:SQLSTATE [42000]:语法错误或访问冲突:1064您 在您的SQL语法错误;检查对应于 你的MySQL服务器版本的“当结束时间IS NULL SUM( TIME_TO_SEC(CASE”在行权语法附近使用手册7

谁能帮我这个好吗?

没关系得到了解决

public function gettotallog($uid,$yr,$mh) 
{          
    $subsql=$this->select() 
      ->setIntegrityCheck(false) 
      ->from(array('u'=>'logmaster'),array('u_id','insert_date', 
       "SUM(TIME_TO_SEC(
       CASE WHEN endtime IS NULL 
       THEN timediff(starttime, starttime) 
       ELSE timediff(endtime, starttime) 
       END)) AS TotalTime" 
       ))     
      ->join(array('i'=>'usermaster'),'u.u_id=i.id',array('uname'=>'name')) 
      ->where("u.insert_date >='$yr-$mh-1' AND u.insert_date <='$yr-$mh-31'")  
      ->where("u.project_id!='NULL'")  
      ->where("u.u_id='$uid'") 
      ->where('u.is_delete=false') 
      ->group('u.insert_date'); 


     $sql=$this->select() 
      ->setIntegrityCheck(false) 
      ->from(array('u'=>$subsql),array("u_id,uname,insert_date,SEC_TO_TIME(SUM(CASE WHEN TotalTime > 32400 
       THEN TotalTime - 28800 
       ELSE 0 
       END)) as OverTime , SEC_TO_TIME(SUM(TotalTime)) AS TotalTime"      
       )); 
     $resultSet = $this->fetchAll($sql);      
     return $resultSet; 
} 
+0

得到我需要的解决方案中,,工作就像魅力!更新了答案的问题.. –

+0

也许你可以将你的解决方案转化为答案并接受答案 - 这样一来,这个问答组合就会成为一个接受答案的问题 - 你也许会得到更多的分数! – goredwards

回答

0
public function gettotallog($uid,$yr,$mh) 
{          
    $subsql=$this->select() 
     ->setIntegrityCheck(false) 
     ->from(array('u'=>'logmaster'),array('u_id','insert_date', 
      "SUM(TIME_TO_SEC(
      CASE WHEN endtime IS NULL 
      THEN timediff(starttime, starttime) 
      ELSE timediff(endtime, starttime) 
      END)) AS TotalTime" 
      ))     
     ->join(array('i'=>'usermaster'),'u.u_id=i.id',array('uname'=>'name')) 
     ->where("u.insert_date >='$yr-$mh-1' AND u.insert_date <='$yr-$mh-31'")  
     ->where("u.project_id!='NULL'")  
     ->where("u.u_id='$uid'") 
     ->where('u.is_delete=false') 
     ->group('u.insert_date'); 


    $sql=$this->select() 
     ->setIntegrityCheck(false) 
     ->from(array('u'=>$subsql),array("u_id,uname,insert_date,SEC_TO_TIME(SUM(CASE WHEN TotalTime > 32400 
      THEN TotalTime - 28800 
      ELSE 0 
      END)) as OverTime , SEC_TO_TIME(SUM(TotalTime)) AS TotalTime"      
      )); 
    $resultSet = $this->fetchAll($sql);      
    return $resultSet; 
}