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