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

Как сделать выборку элементов с фильтром за определенный период по дате

00 голосов
10
Доброго времени суток!

Доступно:
Инфоблок Z у которого есть 2 свойства:
1 - DATE_BEGIN (Дата/Время)
2 - DATE_END (Дата/Время)

Необходимо:
Выбрать все элементы этого инфоблока, где DATE_BEGIN <= ТЕКУЩЕЙ ДАТЫ и ( DATE_END является пустым ИЛИ DATE_END >= ТЕКУЩЕЙ ДАТЫ)

КОД:

$arFilter = Array(
"ACTIVE" => "Y",
"IBLOCK_ID" => "7",
"<=PROPERTY_DATE_BEGIN" => date($DB->DateFormatToPHP(CSite::GetDateFormat("SHORT"))),
array(
"LOGIC" => "OR",
array(">=PROPERTY_DATE_END" => date($DB->DateFormatToPHP(CSite::GetDateFormat("SHORT")))),
array("PROPERTY_DATE_END" => "")
)

);

$dbAllElements = CIBlockElement::GetList(Array("SORT"=>"ASC"),$arFilter,false,false,array('ID','NAME'));

Результат:
Ничего не находит по этому условию.

Дополнительная информация:
После того, как эта, немного сложная, конструкция не дала ожидаемых результатов, попробовал все упростить и сделать просто выборку элементов DATE_BEGIN у которых меньше текущий, и результат тоже был не верный.
$arFilter = Array(
"ACTIVE" => "Y",
"IBLOCK_ID" => "7",
"<PROPERTY_DATE_BEGIN" => date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT")))
);

Попробовал такую же выборку со стандартным полем элемента DATE_ACTIVE_FROM, тогда запрос отработал корректно.
$arFilter = Array(
"ACTIVE" => "Y",
"IBLOCK_ID" => "7",
"<DATE_ACTIVE_FROM" => date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT")))
);

Вывод:
Пока пришел к тому, что выборка по дополнительному свойству которое является ДАТА/ВРЕМЯ работает не корректно.

Призыв:
Подскажите, как правильно решить мою задачу, возможно, я что то не верно делаю или не верно понимаю?
Решали ли кто-нибудь подобные задачи, поделитесь, как вы поступали?
спросил 14 Янв, 13 от CORE (200 баллов)

10 Ответы

00 голосов
Для фильтрации свойства типа дата передавайте значение даты в формате YYYY-MM-DD.
Для выборки пустого свойства используйте "PROPERTY_DATE_END" => false.
Добавьте в селект IBLOCK_ID.
ответил 14 Янв, 13 от Almarea (3,760 баллов)
00 голосов
Большое Спасибо Дмитрий!

Воспользовался вашим советом и вот что получилось:

$dd = date("d.m.Y H.i.s",mktime(23,59,59,date("m"),date("d"),date("Y")));

$arFilter = Array(
"ACTIVE" => "Y",
"IBLOCK_ID" => "7",
"<=PROPERTY_DATE_BEGIN" => $DB->FormatDate($dd,"DD.MM.YYYY HH:MI:SS", "YYYY-MM-DD HH:MI:SS"),
array(
"LOGIC" => "OR",
array("PROPERTY_DATE_END" => false),
array(">=PROPERTY_DATE_END" => $DB->FormatDate($dd,"DD.MM.YYYY HH:MI:SS", "YYYY-MM-DD HH:MI:SS"))
)
);

Да в действительности, формат важен, а также если необходимо чтобы текущий день был включен необходимо указать часы, минуты и секунды с максимальным значением, mktime(23,59,59,date("m"),date("d"),date("Y")).

Запрос стал работать почти корректно, не выполняется только условие OR. Никак не могу понять в чем проблема, он проверяет только одно условие "PROPERTY_DATE_END" => false и если оно не выполняется второе не проверяет ">=PROPERTY_DATE_END" => ТЕКУЩАЯ ДАТА.

Подскажите, пожалуйста, в чем проблема?
ответил 19 Янв, 13 от CORE (200 баллов)
00 голосов
Чет вы немного не то указали. Дата хранится в формате timestamp
YYYY-MM-DD HH:MI:SS, у вас YYYY.MM.DD
ответил 19 Март, 13 от Almarea (3,760 баллов)
00 голосов
В каком месте я указал не то? И правильная ли у меня конструкция фильтра?
ответил 15 Июль, 13 от CORE (200 баллов)
00 голосов
Цитата
Михаил Еферов пишет:
YYYY-MM-DD HH:MI:SS
Невнимателен был, сорри.
Как у вас хранятся свойства инфоблока, в отдельной таблице?
ответил 20 Окт, 13 от Almarea (3,760 баллов)
00 голосов
Я думаю, что да, в отдельной таблице. Это обыкновенные свойства инфоблока ДАТА/ВРЕМЯ, которые добавляются в "настойке свойств элементов". Почему логика выбора не работает не понимаю.
ответил 23 Янв, 14 от CORE (200 баллов)
00 голосов
Цитата
Михаил Еферов пишет:
Я думаю, что да, в отдельной таблице. Это обыкновенные свойства инфоблока ДАТА/ВРЕМЯ, которые добавляются в "настойке свойств элементов". Почему логика выбора не работает не понимаю.

Так вы думаете или знаете? По умолчанию они лежат в той же таблице и тогда, по идее, фильтр должен работать, а вот если свойства в отдельной таблице, то уже другой вопрос.
ответил 12 Май, 14 от Almarea (3,760 баллов)
00 голосов
Где располагаются эти поля по-умолчанию там они и лежат. Значит в той же таблице. Так что скажите? Если вы писали подобные фильтры, скиньте образец, я хоть посмотрю и сравню.
ответил 08 Сен, 14 от CORE (200 баллов)
00 голосов
Итак, в результате выборка, где требуется применить блок "LOGIC", работает не корректно.

Вот код фильтра, где он возвращает только те элементы, где DATE_BEGIN <= ТЕКУЩЕЙ ДАТЫ && DATE_END = false, а условие OR игнорирует.

$dd = date("d.m.Y H.i.s",mktime(23,59,59,date("m"),date("d"),date("Y")));

$arFilter = Array(
"ACTIVE" => "Y",
"IBLOCK_ID" => "7",
"<=PROPERTY_DATE_BEGIN" => $DB->FormatDate($dd,"DD.MM.YYYY HH:MI:SS", "YYYY-MM-DD HH:MI:SS"),
array(
"LOGIC" => "OR",
array("PROPERTY_DATE_END" => false),
array(">=PROPERTY_DATE_END" => $DB->FormatDate($dd,"DD.MM.YYYY HH:MI:SS", "YYYY-MM-DD HH:MI:SS"))
)
);

Жаль! Отказался от этого фильтра и теперь фильтрую все элементы с необходимыми условиями в PHP коде:)
ответил 16 Янв, 15 от CORE (200 баллов)
00 голосов
Код
$arFilter = Array(
   "ACTIVE" => "Y",
   "IBLOCK_ID" => "7",
   array(
      'LOGIC' => 'OR',
      array(
         "<=PROPERTY_DATE_BEGIN" => $DB->FormatDate($dd,"DD.MM.YYYY HH:MI:SS", "YYYY-MM-DD HH:MI:SS"),
         "PROPERTY_DATE_END" => false
      ),
      array(
         "<=PROPERTY_DATE_BEGIN" => $DB->FormatDate($dd,"DD.MM.YYYY HH:MI:SS", "YYYY-MM-DD HH:MI:SS"),
         ">=PROPERTY_DATE_END" => $DB->FormatDate($dd,"DD.MM.YYYY HH:MI:SS", "YYYY-MM-DD HH:MI:SS"),
      ),
   )   
);
Не знаю, попробуйте так.
И все таки посмотрите в настройках инфоблока как хранятся ваши свойства.
ответил 02 Май, 15 от Almarea (3,760 баллов)

Похожие вопросы

0 голосов
5 ответов
0 голосов
2 ответов
0 голосов
2 ответов
спросил 14 Фев, 14 от Lollipopk (660 баллов)
0 голосов
2 ответов
спросил 10 Июнь, 13 от asagava (680 баллов)
0 голосов
0 ответов
спросил 06 Май, 14 от Ris (280 баллов)