예제 #1
0
 /**
  * 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;
     }
 }
예제 #2
0
 /**
  * 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;
     }
 }