Всем добрый день.
Хотелось бы представить общественности на суд простенький запрос (первая публикация) для расчета стоимости периодической услуги.
Исходная задача ставилась следующим образом:
1) На вход подается стоимость услуги за полный месяц;
2) ПериодС и ПериодПо, могут быть как полными месяцами (01.01.15-31.03.15), так и в любой дате месяца (05.01.15-23.02.15)
3) На выходе получаем Сумму исходя из количества полных месяцев в периоде и остатков дней
Если можно решить задачу другим, более красивым способом, интересно было бы почитать мнение гуру
ВЫБРАТЬ
&ПериодС,
&ПериодПо,
ВЫБОР
КОГДА НАЧАЛОПЕРИОДА(&ПериодС, МЕСЯЦ) = &ПериодС
И КОНЕЦПЕРИОДА(&ПериодПо, МЕСЯЦ) = &ПериодПо
ТОГДА РАЗНОСТЬДАТ(&ПериодС, &ПериодПо, МЕСЯЦ) + 1
КОГДА НАЧАЛОПЕРИОДА(&ПериодС, МЕСЯЦ) <> &ПериодС
И КОНЕЦПЕРИОДА(&ПериодПо, МЕСЯЦ) = &ПериодПо
ТОГДА РАЗНОСТЬДАТ(&ПериодС, &ПериодПо, МЕСЯЦ)
КОГДА НАЧАЛОПЕРИОДА(&ПериодС, МЕСЯЦ) = &ПериодС
И КОНЕЦПЕРИОДА(&ПериодПо, МЕСЯЦ) <> &ПериодПо
ТОГДА РАЗНОСТЬДАТ(&ПериодС, &ПериодПо, МЕСЯЦ)
ИНАЧЕ 0
КОНЕЦ КАК КоличествоПолныхМесяцев,
ЕСТЬNULL(ВЫБОР
КОГДА НЕ НАЧАЛОПЕРИОДА(&ПериодС, МЕСЯЦ) = &ПериодС
ТОГДА РАЗНОСТЬДАТ(&ПериодС, КОНЕЦПЕРИОДА(&ПериодС, МЕСЯЦ), ДЕНЬ)
КОНЕЦ, 0) КАК ОстатокДнейПериодС,
ЕСТЬNULL(ВЫБОР
КОГДА НЕ КОНЕЦПЕРИОДА(&ПериодПо, МЕСЯЦ) = &ПериодПо
ТОГДА РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&ПериодПо, МЕСЯЦ), &ПериодПо, ДЕНЬ) + 1
КОНЕЦ, 0) КАК ОстатокДнейПериодПо,
НАЧАЛОПЕРИОДА(&ПериодС, МЕСЯЦ) КАК НачалоМесяцаПериодС,
КОНЕЦПЕРИОДА(&ПериодС, МЕСЯЦ) КАК КонецоМесяцаПериодС,
РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&ПериодС, МЕСЯЦ), КОНЕЦПЕРИОДА(&ПериодС, МЕСЯЦ), ДЕНЬ) + 1 КАК КоличествоДнейПериодС,
РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&ПериодПо, МЕСЯЦ), КОНЕЦПЕРИОДА(&ПериодПо, МЕСЯЦ), ДЕНЬ) + 1 КАК КоличествоДнейПериодПо
ПОМЕСТИТЬ ТаблицаПериодов
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ТаблицаПериодов.ПериодС,
ТаблицаПериодов.ПериодПо,
ТаблицаПериодов.КоличествоПолныхМесяцев,
ТаблицаПериодов.ОстатокДнейПериодС,
ТаблицаПериодов.ОстатокДнейПериодПо,
ТаблицаПериодов.КоличествоДнейПериодС,
ТаблицаПериодов.КоличествоДнейПериодПо,
ВЫРАЗИТЬ(&Цена / ТаблицаПериодов.КоличествоДнейПериодС КАК ЧИСЛО(15, 2)) КАК ЦенаДняПериодС,
ВЫРАЗИТЬ(&Цена / ТаблицаПериодов.КоличествоДнейПериодПо КАК ЧИСЛО(15, 2)) КАК ЦенаДняПериодПо,
&Цена * ТаблицаПериодов.КоличествоПолныхМесяцев + (ВЫРАЗИТЬ(&Цена / ТаблицаПериодов.КоличествоДнейПериодС КАК ЧИСЛО(15, 2))) * ТаблицаПериодов.ОстатокДнейПериодС + (ВЫРАЗИТЬ(&Цена / ТаблицаПериодов.КоличествоДнейПериодПо КАК ЧИСЛО(15, 2))) * ТаблицаПериодов.ОстатокДнейПериодПо КАК Сумма
ИЗ
ТаблицаПериодов КАК ТаблицаПериодов