Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Фильтр по диапазону дат

00 голосов
4
Никак не могу решить проблему с фильтром по дате.
Дано: два свойства записи, даты размещения с/по
И фильтр с двумя полями с/по

Как правильно записать фильтр, чтобы осуществлялась фильтрация в диапазоне? Грубо говоря, необходимо сравнение двух диапазонов дат и вывод совпадений.

Голова уже наперекосяк, но решения нет ((
спросил 26 Май, 13 от Waicon (280 баллов)

4 Ответы

00 голосов
попробуйте сделать как здесь показано - http://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockelement/getlist.php
внизу в Примерах использования есть:
Цитата
Задача: Фильтрация "от" и "до" по свойству типа "Дата/Время".
ответил 26 Май, 13 от EDKA (980 баллов)
00 голосов
Вот еще ссылка на документациюhttp://dev.1c-bitrix.ru/api_help/iblock/filters/date.php
ответил 27 Май, 13 от Tirkan (400 баллов)
00 голосов
Сложный вариант фильтрации диапазона

Код
   $arFilter = Array
   (
   "IBLOCK_ID"=>13, 
   "PROPERTY_ROOM"=>intval($room_id), 
   array
   (
   "LOGIC" => "OR",
   array
   (
   "LOGIC" => "AND",
   "<=DATE_ACTIVE_FROM"=>date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT")), mktime(0,0,0,$date_begin_mon,$date_begin_day,$date_begin_year)),
   "<DATE_ACTIVE_FROM"=>date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT")), mktime(0,0,0,$date_end_mon,$date_end_day,$date_end_year)),
   ">=DATE_ACTIVE_TO"=>date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT")), mktime(0,0,0,$date_begin_mon,$date_begin_day,$date_begin_year)),
   "<DATE_ACTIVE_TO"=>date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT")), mktime(0,0,0,$date_end_mon,$date_end_day,$date_end_year)),
   ),
   array
   (
   "LOGIC" => "AND",
   ">DATE_ACTIVE_FROM"=>date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT")), mktime(0,0,0,$date_begin_mon,$date_begin_day,$date_begin_year)),
   "<DATE_ACTIVE_FROM"=>date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT")), mktime(0,0,0,$date_end_mon,$date_end_day,$date_end_year)),
   ">DATE_ACTIVE_TO"=>date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT")), mktime(0,0,0,$date_begin_mon,$date_begin_day,$date_begin_year)),
   "<DATE_ACTIVE_TO"=>date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT")), mktime(0,0,0,$date_end_mon,$date_end_day,$date_end_year)),
   ),
   array
   (
   "LOGIC" => "AND",
   ">DATE_ACTIVE_FROM"=>date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT")), mktime(0,0,0,$date_begin_mon,$date_begin_day,$date_begin_year)),
   "<=DATE_ACTIVE_FROM"=>date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT")), mktime(0,0,0,$date_end_mon,$date_end_day,$date_end_year)),
   ">DATE_ACTIVE_TO"=>date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT")), mktime(0,0,0,$date_begin_mon,$date_begin_day,$date_begin_year)),
   ">=DATE_ACTIVE_TO"=>date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT")), mktime(0,0,0,$date_end_mon,$date_end_day,$date_end_year)),
   ),
   array
   (
   "LOGIC" => "AND",
   "<=DATE_ACTIVE_FROM"=>date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT")), mktime(0,0,0,$date_begin_mon,$date_begin_day,$date_begin_year)),
   "<DATE_ACTIVE_FROM"=>date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT")), mktime(0,0,0,$date_end_mon,$date_end_day,$date_end_year)),
   ">DATE_ACTIVE_TO"=>date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT")), mktime(0,0,0,$date_begin_mon,$date_begin_day,$date_begin_year)),
   ">=DATE_ACTIVE_TO"=>date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT")), mktime(0,0,0,$date_end_mon,$date_end_day,$date_end_year)),
   ),
   ),
   );
   $res = CIBlockElement::GetList(Array("PROPERTY_VARIANTES"=>"ASC","ID"=>"ASC","PROPERTY_PRICE"=>"ASC","PROPERTY_ROOM"=>"ASC"), $arFilter,false, false, Array());
 


код работающий, но в нем есть две лишние строчки. Если найдете - считайте, что разобрались с фильтрацией по датам.
ответил 23 Авг, 13 от Tirkan (400 баллов)
00 голосов
Вот, к примеру, выборка за год:

Код
      $arFilter = Array(
         "ACTIVE" => "Y",
         ">=".$arParams["DATE_FIELD"] => date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT")), mktime(0,0,0,1,1,$currentYear)),
         "<".$arParams["DATE_FIELD"] => date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT")), mktime(0,0,0,13,1,$currentYear)),
         "IBLOCK_ID" => $arParams["IBLOCK_ID"]
      );

      $arSelectedFields = Array($arParams["DATE_FIELD"]);
      $dbItems = CIBlockElement::GetList(array($arParams["DATE_FIELD"]=>"ASC", "ID"=>"ASC"), $arFilter, false, false, $arSelectedFields);
 
ответил 22 Ноя, 13 от Hohat (720 баллов)