/** * Receives a FunctionExpression and changes it so that it conforms to this * SQL dialect. * * @param \Cake\Database\Expression\FunctionExpression $expression The function expression to convert to TSQL. * @return void */ protected function _transformFunctionExpression(FunctionExpression $expression) { switch ($expression->name()) { case 'CONCAT': // CONCAT function is expressed as exp1 + exp2 $expression->name('')->tieWith(' +'); break; case 'DATEDIFF': $hasDay = false; $visitor = function ($value) use(&$hasDay) { if ($value === 'day') { $hasDay = true; } return $value; }; $expression->iterateParts($visitor); if (!$hasDay) { $expression->add(['day' => 'literal'], [], true); } break; case 'CURRENT_DATE': $time = new FunctionExpression('GETUTCDATE'); $expression->name('CONVERT')->add(['date' => 'literal', $time]); break; case 'CURRENT_TIME': $time = new FunctionExpression('GETUTCDATE'); $expression->name('CONVERT')->add(['time' => 'literal', $time]); break; case 'NOW': $expression->name('GETUTCDATE'); break; case 'EXTRACT': $expression->name('DATEPART')->tieWith(' ,'); break; case 'DATE_ADD': $params = []; $visitor = function ($p, $key) use(&$params) { if ($key === 0) { $params[2] = $p; } else { $valueUnit = explode(' ', $p); $params[0] = rtrim($valueUnit[1], 's'); $params[1] = $valueUnit[0]; } return $p; }; $manipulator = function ($p, $key) use(&$params) { return $params[$key]; }; $expression->name('DATEADD')->tieWith(',')->iterateParts($visitor)->iterateParts($manipulator)->add([$params[2] => 'literal']); break; case 'DAYOFWEEK': $expression->name('DATEPART')->tieWith(' ')->add(['weekday, ' => 'literal'], [], true); break; } }
/** * Receives a FunctionExpression and changes it so that it conforms to this * SQL dialect. * * @param \Cake\Database\Expression\FunctionExpression $expression The function expression to convert to TSQL. * @return void */ protected function _transformFunctionExpression(FunctionExpression $expression) { switch ($expression->name()) { case 'CONCAT': // CONCAT function is expressed as exp1 + exp2 $expression->name('')->type(' +'); break; case 'DATEDIFF': $hasDay = false; $visitor = function ($value) use(&$hasDay) { if ($value === 'day') { $hasDay = true; } return $value; }; $expression->iterateParts($visitor); if (!$hasDay) { $expression->add(['day' => 'literal'], [], true); } break; case 'CURRENT_DATE': $time = new FunctionExpression('GETUTCDATE'); $expression->name('CONVERT')->add(['date' => 'literal', $time]); break; case 'CURRENT_TIME': $time = new FunctionExpression('GETUTCDATE'); $expression->name('CONVERT')->add(['time' => 'literal', $time]); break; case 'NOW': $expression->name('GETUTCDATE'); break; } }