gifts2017

Количество дней недели (понедельников/вторников/...) в заданном диапазоне одним запросом

Опубликовал Alexander Shvets (Alexander.Shvets) в раздел Программирование - Практика программирования

При реализации периодического авто-заполнения маршрутных листов по графику (недельному) необходимо было просчитать стоимость всего периода, с условием выездов только по определенным дням. Заморачиваться с обходом результата не хотелось. Пришлось написать "Небольшой" запрос.

С чего начнем. Наверное, с теории.

Первым делом у нас из входящих данных есть только НачалоПериода и КонецПериода. Соответственно нам нужно с чем-то соединять эти данные. В любой типовой конфигурации более рентабельно было бы использовать Регл.Календарь. Но не тут-то было. Конфа совсем не типовая... Поэтому запрос писался для "вакуума".


 * Благодаря товарищу ildarovich, нашлось более лаконичное решение, за что отдельное спасибо. С помощью разности дат с периодом "неделя":

ВЫБРАТЬ
    Дни.ДеньНедели,
    РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, -Дни.ДеньНедели), НЕДЕЛЯ)
, НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&КонецПериода, ДЕНЬ, 1 - Дни.ДеньНедели), НЕДЕЛЯ), ДЕНЬ) / 7 КАК КоличествоДней
ИЗ
    (ВЫБРАТЬ 1 КАК ДеньНедели ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5
    ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7) КАК Дни

В результате мы получили таблицу вида:
(параметры:
НачалоПериода = 01.03.2016; 
КонецПериода = 31.03.2016)

ДеньНедели КоличествоДней  
1 4
2 5
3 5
4 5
5 4
6 4
7 4


upd.  14.03.2016. Добавил обработку-пример

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Количество дней недели в заданном диапазоне
.epf 7,81Kb
14.03.16
0
.epf 7,81Kb 0 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Сергей (ildarovich) 03.03.16 20:43
Тот же результат дает гораздо более простой запрос
ВЫБРАТЬ
	Дни.ДеньНедели,
	РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&НачалоПериода, НЕДЕЛЯ), НАЧАЛОПЕРИОДА(&КонецПериода, НЕДЕЛЯ), ДЕНЬ) / 7 + ВЫБОР
		КОГДА ДЕНЬНЕДЕЛИ(&НачалоПериода) <= Дни.ДеньНедели
			ТОГДА 1
		ИНАЧЕ 0
	КОНЕЦ + ВЫБОР
		КОГДА Дни.ДеньНедели <= ДЕНЬНЕДЕЛИ(&КонецПериода)
			ТОГДА 1
		ИНАЧЕ 0
	КОНЕЦ - 1 КАК КоличествоДней
ИЗ
	(ВЫБРАТЬ
		1 КАК ДеньНедели
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		2
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		3
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		4
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		5
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		6
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		7) КАК Дни
...Показать Скрыть

или еще короче
ВЫБРАТЬ
	Дни.ДеньНедели,
	РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, -Дни.ДеньНедели), НЕДЕЛЯ)
, НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&КонецПериода, ДЕНЬ, 1 - Дни.ДеньНедели), НЕДЕЛЯ), ДЕНЬ) / 7 КАК КоличествоДней
ИЗ
	(ВЫБРАТЬ 1 КАК ДеньНедели ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5
	ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7) КАК Дни
...Показать Скрыть
DoctorRoza; bforce; BigB; Alexander.Shvets; NeviD; the1; qwed557; +7 Ответить
2. Руслан (lrs) 04.03.16 15:30
В способностях ildarovich'а писать запросы мы не сомневаемся.
Но не стоило удалять первоначальный вариант, иначе теряется смысл твоих стараний. А так же нам теперь трудно оценить степень оптимизации, предложенную ildarovich'ем...
igormiro; alest; dj_serega; +3 Ответить 1
3. Alexander Shvets (Alexander.Shvets) 04.03.16 15:41
(2) lrs, Можете не сомневаться :Уровень оптимизации - бог =)

А старый запрос потерялся, я его засунул в спойлер, а инфостарт просто взбесился от конструкции div class="spoil". На предосмотре было все ок, а когда сохранил - он удалил все что было в спойлере + добавил пол страницы инфостарта в мою публикацию =))

Если в двух словах - мой метод - это левое соединение к таблицам дней периодов (две строки - Начало и конец) по условию >= <= и группировка результата, этот метод - расчета относительно дня недели. Изи. На многие вещи посмотрел по другому в принципе.
dj_serega; +1 Ответить
4. Виктор Григоренко (JohnGalt) 21.11.16 16:16
Можно также использовать РС "РегламентированныйПроизводственныйКалендарь"
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа