Работа с календарем (рабочие и праздничные дни)

Автор SC7793, 20 октября 2018, 03:48:43

« назад - далее »

SC7793

Добрый день. Подскажите пожалуйста, как реализовать данную задачу: необходимо рассчитать количество рабочих дней в промежутке двух дат (функция networkdays - не подходит для нас, нужно как-то стыковать с календарём).

В моём приложении дата начала=13.01.2017, дата завершения 18.01.2017
Информация по датам (начала и завершения) находится в двух разных таблицах, к каждой из этих таблиц я подтянул производственный календарь (для "Даты начала" это "Ref_Сalendar1", для "Даты окончания" это "Ref_Сalendar2" (возможно и не нужно две таблицы с календарём...) ).
Выходные дни в таблицах Ref_Сalendar в поле Id_status имеют значение "15" (выделил желтым на скриншоте), рабочие дни ="14".
Можно ли как-то посчитать корректно количество рабочих дней с 13.01 по 18.01

Заранее благодарю за решение.

Chernov

Так считаем выходные дни:
= COUNT ( DISTINCT {< Ref_Calendar1_Id_status = {"15"} >} Ref_Calendar1_Id)
Так считаем рабочие дни:
= COUNT ( DISTINCT {< Ref_Calendar1_Id_status = {"14"} >} Ref_Calendar1_Id)

Дату начала и дату окончания сделайте в переменных

SC7793

Да, это работает без выбора фильтров, считает кол-во вых. и раб.дней за весь месяц (скрин_01)
Но, не совсем понятно как сделать, чтобы это работало при выборе фильтров (скрин_02) ???
В моём случае нужен 1 календарь ? или 2 ? 

admin

Привет, даты завершения и начала выбираете в разных измерениях?
Зачем?
Сделайте одно измерение Дата и выбирайте в нем.
Иначе у вас выберутся только две даты для всей модели данных.

SC7793

Привет.
Логику понял.
Но не знаю как реализовать, сможете подсказать?

Chernov

Цитата: SC7793 от 22 октября  2018, 07:18:54  
Да, это работает без выбора фильтров, считает кол-во вых. и раб.дней за весь месяц (скрин_01)
Но, не совсем понятно как сделать, чтобы это работало при выборе фильтров (скрин_02) ???
В моём случае нужен 1 календарь ? или 2 ?
Можете использовать 1, можете два, как угодно в принципе.. но я бы сделал 1.

COUNT ( DISTINCT {< Ref_Calendar1_Id_status = {"14"}, bd_proc_step_pos_sp.dsdt_finish_date_perf3 = {">=$(=MIN(bd_proc_step_sp.dsdt_start_date3)<=$(=MAX(bd_proc_step_sp.dsdt_finish_date3)) "} >} Ref_Calendar1_Id)

SC7793


Можете использовать 1, можете два, как угодно в принципе.. но я бы сделал 1.

COUNT ( DISTINCT {< Ref_Calendar1_Id_status = {"14"}, bd_proc_step_pos_sp.dsdt_finish_date_perf3 = {">=$(=MIN(bd_proc_step_sp.dsdt_start_date3)<=$(=MAX(bd_proc_step_sp.dsdt_finish_date3)) "} >} Ref_Calendar1_Id)
[/quote]

Почему то. этот скрипт у меня не отрабатывает (и с фильтрами и без), может я что-то делаю не так (скрин_03) ?

Chernov

Цитата: SC7793 от 22 октября  2018, 07:44:36  

Можете использовать 1, можете два, как угодно в принципе.. но я бы сделал 1.

COUNT ( DISTINCT {< Ref_Calendar1_Id_status = {"14"}, bd_proc_step_pos_sp.dsdt_finish_date_perf3 = {">=$(=MIN(bd_proc_step_sp.dsdt_start_date3)<=$(=MAX(bd_proc_step_sp.dsdt_finish_date3)) "} >} Ref_Calendar1_Id)

Почему то. этот скрипт у меня не отрабатывает (и с фильтрами и без), может я что-то делаю не так (скрин_03) ?
[/quote]
Проверьте по отдельности :
$(=MIN(bd_proc_step_sp.dsdt_start_date3)
$(=MAX(bd_proc_step_sp.dsdt_finish_date3))
и что вот в этом поле лежит ?: bd_proc_step_pos_sp.dsdt_finish_date_perf3 , может его нужно заменить на это bd_proc_step_sp.dsdt_start_date3 или это bd_proc_step_sp.dsdt_finish_date3

SC7793

Цитата: Chernov от 22 октября  2018, 08:41:46  
Цитата: SC7793 от 22 октября  2018, 07:44:36  

Можете использовать 1, можете два, как угодно в принципе.. но я бы сделал 1.

COUNT ( DISTINCT {< Ref_Calendar1_Id_status = {"14"}, bd_proc_step_pos_sp.dsdt_finish_date_perf3 = {">=$(=MIN(bd_proc_step_sp.dsdt_start_date3)<=$(=MAX(bd_proc_step_sp.dsdt_finish_date3)) "} >} Ref_Calendar1_Id)

Почему то. этот скрипт у меня не отрабатывает (и с фильтрами и без), может я что-то делаю не так (скрин_03) ?
Проверьте по отдельности :
$(=MIN(bd_proc_step_sp.dsdt_start_date3)
$(=MAX(bd_proc_step_sp.dsdt_finish_date3))
и что вот в этом поле лежит ?: bd_proc_step_pos_sp.dsdt_finish_date_perf3 , может его нужно заменить на это bd_proc_step_sp.dsdt_start_date3 или это bd_proc_step_sp.dsdt_finish_date3
[/quote]


Проверил по отдельности, результат не считает. :(
bd_proc_step_pos_sp.dsdt_finish_date_perf3 - это дата завершения задачи
bd_proc_step_sp.dsdt_start_date3 - дата начала задачи

Вообще нужно чтобы при выборе этапа, был результат по кол-ву затраченных рабочих дней на задачу (скрин_04).
Может нужно думать в направлении одного календаря на обе даты. У меня сейчас два календаря на каждую из дат (нач. и заверш.) по отдельности (скрин_05)?

SC7793

Всем привет.
Немного упростил пример (вопрос.zip)
Может быть так сможете помочь. Буду очень благодарен за подсказку.

Вкратце опишу вопрос. Необходимо при выборе фильтра name (Задача), получать корректное значение по срокам выполнения задачи, а именно срок выполнения задачи в рабочих днях.
В примере при выборе фильтра  "задача1", которая имеет start_date = 13.01.2017 и finish_date = 18.01.2017. Необходимо рассчитать разница между этими датами с учётом выходных дней.
Таблица"Calendar" имеет 2 поля, Data и Id_status (значение поля =0 - это выходные; 1- рабочие дни).

Во вложении скрины + архив с файлов приложения *.qvf и таблица в *.xlsx

Заранее благодарен.



admin

Привет.
Хорошим решением будет использование интервалов.
Т.е. У вас есть Дата календарная, та по которой живем. Есть даты начала события и конца события (задачи).
Все условия для использования IntervalMatch()
На оф.сайте в справке есть пример.

SC7793

Цитата: admin от 23 октября  2018, 03:38:00  
Привет.
Хорошим решением будет использование интервалов.
Т.е. У вас есть Дата календарная, та по которой живем. Есть даты начала события и конца события (задачи).
Все условия для использования IntervalMatch()
На оф.сайте в справке есть пример.

Ок, спасибо. Посмотрю что с этим можно сделать.


Валерий

Привет! А вариант создания доп таблицы с выходными днями на весь год не рассматриваете?
Джойните её при загрузке данных с доп полем "hollyday" к основной таблице, далее играесь фильтрами в приложении.

Один из плюсов - вы можете сами создавать нестандартные выходные или рабочие дни.

SC7793

#14
Цитата: Валерий от 30 октября  2018, 09:29:06  
Привет! А вариант создания доп таблицы с выходными днями на весь год не рассматриваете?
Джойните её при загрузке данных с доп полем "hollyday" к основной таблице, далее играесь фильтрами в приложении.

Один из плюсов - вы можете сами создавать нестандартные выходные или рабочие дни.

Валерий, приветствую.
У меня в примере как раз создана отдельная таблица с производственным календарём. (календарь.JPG).
Не представляю как можно осн. табл. объединить с календарём по доп полю "hollyday"?  (нет схожих полей в двух таблицах)
Если у вас есть своё решение, не откажусь на него посмотреть :)

осн.таблица в таком формате: 
id                              start_date     finish_date     name
0800071387eb6870   13.01.2017   18.01.2017   задача1
0800071387eb6871   14.01.2017   21.01.2017   задача2


Ранее были опробованы варианты других участников обсуждения.
Корректные результаты показала функция IntervalMatch(), НО есть в этом также минус, если много данных, Qlik не справляется, я так понимаю что каждой задачи присваивает интервал и слишком много записей в таблице получается.
+ тоже корректные данные показывает вариант Станислава (без объединения таблиц) = SUM ( { < Data = {">=$(=min(start_date))<=$(=max(finish_date))"} > }  Id_status), но для меня это не совсем подходит, данные отражаются в том случае если выбран фильтр с задачами. Для меня идеальным вариантом было бы -  подсчёт и с фильтрами и без выбора фильтров, это на 100% подходит мне (без фильтров.JPG), (с фильтрами.JPG).

Яндекс.Метрика