3namespace Bitrix\Main\DB;
8use Bitrix\Main\ORM\Fields\ScalarField;
47 public function forSql($value, $maxLength = 0)
51 $value = mb_substr($value, 0, $maxLength);
53 $value = str_replace(
"'",
"''", $value);
54 $value = str_replace(
"\x00",
"", $value);
71 return "convert(datetime, cast(year(getdate()) as varchar(4)) + '-' + cast(month(getdate()) as varchar(2)) + '-' + cast(day(getdate()) as varchar(2)), 120)";
81 $from = static::getCurrentDateTimeFunction();
84 return 'DATEADD(second, '.$seconds.
', '.$from.
')';
92 return 'DATEADD(dd, DATEDIFF(dd, 0, '.$value.
'), 0)';
107 foreach (preg_split(
"#(YYYY|MMMM|MM|MI|M|DD|HH|H|GG|G|SS|TT|T)#", $format, -1, PREG_SPLIT_DELIM_CAPTURE) as $part)
112 $result[] =
"\n\tCONVERT(varchar(4),DATEPART(yyyy, $field))";
115 $result[] =
"\n\tdatename(mm, $field)";
118 $result[] =
"\n\tREPLICATE('0',2-LEN(DATEPART(mm, $field)))+CONVERT(varchar(2),DATEPART(mm, $field))";
121 $result[] =
"\n\tREPLICATE('0',2-LEN(DATEPART(mi, $field)))+CONVERT(varchar(2),DATEPART(mi, $field))";
124 $result[] =
"\n\tCONVERT(varchar(3), $field,7)";
127 $result[] =
"\n\tREPLICATE('0',2-LEN(DATEPART(dd, $field)))+CONVERT(varchar(2),DATEPART(dd, $field))";
131 $result[] =
"\n\tREPLICATE('0',2-LEN(DATEPART(hh, $field)))+CONVERT(varchar(2),DATEPART(hh, $field))";
135 $result[] =
"\n\tCASE WHEN DATEPART(HH, $field) < 13 THEN RIGHT(REPLICATE('0',2) + CAST(datepart(HH, $field) AS VARCHAR(2)),2) ELSE RIGHT(REPLICATE('0',2) + CAST(datepart(HH, dateadd(HH, -12, $field)) AS VARCHAR(2)), 2) END";
138 $result[] =
"\n\tREPLICATE('0',2-LEN(DATEPART(ss, $field)))+CONVERT(varchar(2),DATEPART(ss, $field))";
142 $result[] =
"\n\tCASE WHEN DATEPART(HH, $field) < 12 THEN 'AM' ELSE 'PM' END";
158 $sql =
'SUBSTRING('.$str.
', '.$from;
160 if (!is_null($length))
161 $sql .=
', '.$length;
163 $sql .=
', LEN('.$str.
') + 1 - '.$from;
173 return implode(
" + ", func_get_args());
181 return "ISNULL(".$expression.
", ".
$result.
")";
189 return "LEN(".$field.
")";
197 return "CONVERT(datetime, '".$value.
"', 120)";
205 return "CONVERT(varchar(19), ".$fieldName.
", 120)";
213 return 'CAST('.$fieldName.
' AS varchar)';
221 return 'CONVERT(VARCHAR(8000), '.$fieldName.
')';
231 return array($this,
"convertFromDbDateTime");
235 return array($this,
"convertFromDbDate");
239 return array($this,
"convertFromDbString");
243 return parent::getConverter($field);
254 $value =
new Type\DateTime(mb_substr($value, 0, 19),
"Y-m-d H:i:s");
280 if(preg_match(
"#^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}\$#", $value))
286 return parent::convertFromDbString($value, $length);
316 $values = $field->getValues();
318 if (preg_match(
'/^[0-9]+$/', $values[0]) && preg_match(
'/^[0-9]+$/', $values[1]))
324 $falseLen = strlen($values[0]);
325 $trueLen = strlen($values[1]);
326 if ($falseLen === 1 && $trueLen === 1)
330 return 'varchar(' . max($falseLen, $trueLen) .
')';
335 return 'varchar('.max(array_map(
'strlen', $field->getValues())).
')';
340 $defaultLength =
false;
345 if ($defaultLength ===
false || $defaultLength > $validator->getMax())
347 $defaultLength = $validator->getMax();
351 return 'varchar('.($defaultLength > 0? $defaultLength: 255).
')';
417 $offset = intval($offset);
418 $limit = intval($limit);
420 if ($offset > 0 && $limit <= 0)
427 $sql = preg_replace(
"/^\\s*SELECT/i",
"SELECT TOP ".$limit, $sql);
434 preg_match_all(
"#\\sorder\\s+by\\s#i", $sql,
$matches, PREG_OFFSET_CAPTURE);
438 $s = mb_substr($sql, $idx);
439 if (substr_count($s,
'(') === substr_count($s,
')'))
442 $sqlTmp = mb_substr($sql, 0, $idx);
448 $orderBy =
"ORDER BY (SELECT 1)";
453 $sqlTmp = preg_replace(
455 "SELECT ROW_NUMBER() OVER (".$orderBy.
") AS ROW_NUMBER_ALIAS,",
460 "WITH ROW_NUMBER_QUERY_ALIAS AS (".$sqlTmp.
") ".
462 "FROM ROW_NUMBER_QUERY_ALIAS ".
463 "WHERE ROW_NUMBER_ALIAS BETWEEN ".($offset + 1).
" AND ".($offset + $limit);
476 $updateColumns =
array();
477 $sourceSelectValues =
array();
478 $sourceSelectColumns =
array();
479 $targetConnectColumns =
array();
480 $tableFields = $this->connection->getTableFields($tableName);
481 foreach($tableFields as $columnName => $tableField)
483 $quotedName = $this->
quote($columnName);
484 if (in_array($columnName, $primaryFields))
486 $sourceSelectValues[] = $this->
convertToDb($insertFields[$columnName], $tableField);
487 $sourceSelectColumns[] = $quotedName;
488 if($insertFields[$columnName] ===
null)
491 $targetConnectColumns[] =
"(source.".$quotedName.
" IS NULL AND target.".$quotedName.
" IS NULL)";
495 $targetConnectColumns[] =
"(source.".$quotedName.
" = target.".$quotedName.
")";
499 if (isset($updateFields[$columnName]) || array_key_exists($columnName, $updateFields))
501 $updateColumns[] =
"target.".$quotedName.
' = '.$this->
convertToDb($updateFields[$columnName], $tableField);
506 $insert && $insert[0] !=
"" && $insert[1] !=
""
508 && $sourceSelectValues && $sourceSelectColumns && $targetConnectColumns
512 MERGE INTO ".$this->quote($tableName).
" AS target USING (
513 SELECT ".implode(
", ", $sourceSelectValues).
"
515 ".implode(
", ", $sourceSelectColumns).
"
519 ".implode(
" AND ", $targetConnectColumns).
"
522 UPDATE SET ".implode(
", ", $updateColumns).
"
523 WHEN NOT MATCHED THEN
524 INSERT (".$insert[0].
")
525 VALUES (".$insert[1].
")
softCastTextToChar($fieldName)
getTopSql($sql, $limit, $offset=0)
getIsNullFunction($expression, $result)
getDateToCharFunction($fieldName)
formatDate($format, $field=null)
getDatetimeToDateFunction($value)
convertFromDbString($value, $length=null)
getFieldByColumnType($name, $type, array $parameters=null)
getColumnTypeByField(ScalarField $field)
getSubstrFunction($str, $from, $length=null)
getConverter(ScalarField $field)
getLengthFunction($field)
forSql($value, $maxLength=0)
getCurrentDateTimeFunction()
convertFromDbDateTime($value)
addSecondsToDateTime($seconds, $from=null)
convertFromDbDate($value)
getCharToDateFunction($value)
prepareMerge($tableName, array $primaryFields, array $insertFields, array $updateFields)
prepareInsert($tableName, array $fields, $returnAsArray=false)
convertToDb($value, ORM\Fields\IReadable $field=null)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"