1

Zend フレームワークで時間追跡システムを実装しています。

その中で、次の 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 サーバーのバージョンに対応するマニュアルを参照して、7 行目の 'SUM( TIME_TO_SEC( CASE WHEN endtime IS NULL ' の近くで使用する正しい構文を確認してください。

誰でもこれで私を助けてくれますか?

ネバー・マインド・ガット・ザ・ソリューション

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;
}
4

1 に答える 1

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;
}
于 2016-03-21T10:42:35.153 に答える