| 
    
        
     
     | 
    
    
  | 
Запрос, возвращающий количество дней в месяце без учёта выходных | ☑ | ||
|---|---|---|---|---|
| 
    0
    
        Sibi-2    
     19.10.13 
            ✎
    12:52 
 | 
         
        Написать запрос, который по входному параметру «Месяц» типа «Дата», возвращает количество дней в месяце без выходных (субботы, воскресенья).
 
        Например, параметр Месяц = «1 мая 2013», результат запроса: 23.  | 
|||
| 
    1
    
        Maxus43    
     19.10.13 
            ✎
    12:54 
 | 
         
        производственный календарь есть в конфе? тогда проблем нет     
         | 
|||
| 
    2
    
        Генерал    
     19.10.13 
            ✎
    12:55 
 | 
         
        свяжи с производственным календарем и извлекай     
         | 
|||
| 
    3
    
        Sibi-2    
     19.10.13 
            ✎
    12:55 
 | 
         
        Нет, это задача исключительно для решения при помощи запросов :) Никакой конфы у нас условно нет     
         | 
|||
| 
    4
    
        Grobik    
     19.10.13 
            ✎
    12:57 
 | 
         
        Если за определенный год, например 2009-2014 то без проблем. А в общем случае никак.     
         | 
|||
| 
    5
    
        Maxus43    
     19.10.13 
            ✎
    12:57 
 | 
         
        (3) в общем случае это невозможно, по той простой причине что каждый Год правительство РФ сама тасует праздники, переносит их на другие дни и выпускает утверждённый календарь     
         | 
|||
| 
    6
    
        Sibi-2    
     19.10.13 
            ✎
    12:58 
 | 
         
        Выкидываем только субботу и воскресение     
         | 
|||
| 
    7
    
        GROOVY    
     19.10.13 
            ✎
    12:59 
 | 
         
        Хорошая, но тупая, для проверки знаний сотрудника, задача. Взял в копилку...     
         | 
|||
| 
    8
    
        Grobik    
     19.10.13 
            ✎
    13:00 
 | 
         
        (6) Тогда вообще смехотворно.     
         | 
|||
| 
    9
    
        Maxus43    
     19.10.13 
            ✎
    13:02 
 | 
         
        (7) я вот сходу запрос не напишу такой, надо строрить таблицу дат и т.д. - нафиг     
         | 
|||
| 
    10
    
        GenV    
     19.10.13 
            ✎
    13:04 
 | 
         
        (9) Разность дат в днях, зная день недели первой даты?     
         | 
|||
| 
    11
    
        Sibi-2    
     19.10.13 
            ✎
    13:06 
 | 
         
        Разность дат - да, но тоже не слишком тривиально. Есть вот такой вариант, но ошибаемся на 1 день: ВЫБРАТЬ
 
        ДЕНЬГОДА(КОНЕЦПЕРИОДА(&ДатаЗ, МЕСЯЦ)) - ДЕНЬГОДА(НАЧАЛОПЕРИОДА(&ДатаЗ, МЕСЯЦ))- (НЕДЕЛЯ(КОНЕЦПЕРИОДА(&ДатаЗ, МЕСЯЦ)) - НЕДЕЛЯ(НАЧАЛОПЕРИОДА(&ДатаЗ, МЕСЯЦ)))*2 КАК Поле1  | 
|||
| 
    12
    
        GROOVY    
     19.10.13 
            ✎
    13:06 
 | 
         
        (10) Угу.     
         | 
|||
| 
    13
    
        Maxus43    
     19.10.13 
            ✎
    13:11 
 | 
         
        (10) а кто сказал что ты её знаешь?     
         | 
|||
| 
    14
    
        GROOVY    
     19.10.13 
            ✎
    13:14 
 | 
         
        (13) Там же месяц как дата передается.     
         | 
|||
| 
    15
    
        GenV    
     19.10.13 
            ✎
    13:19 
 | 
         
        (13) Параметр дата, затем ДЕНЬНЕДЕЛИ(&НачалоПериода)     
         | 
|||
| 
    16
    
        Maxus43    
     19.10.13 
            ✎
    13:20 
 | 
         
        а, я думал без даты надо построить таблицу годов, учитывая високосные и т.д.)     
         | 
|||
| 
    17
    
        Sibi-2    
     19.10.13 
            ✎
    15:19 
 | 
         
        Это всё? :)     
         | 
|||
| 
    18
    
        Rovan    
     гуру 
    19.10.13 
            ✎
    16:07 
 | 
         
        (17) начинай сам писать запрос с учетом (15)
 
        покажи что получилось если не буде работать еще что-то посоветуем  | 
|||
| 
    19
    
        Kaushly    
     19.10.13 
            ✎
    16:56 
 | 
         
        ВЫБРАТЬ
 
        ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 0) КАК ДатаМесяца ПОМЕСТИТЬ ДниМесяца ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 1) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 2) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 3) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 4) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 5) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 6) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 7) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 8) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 9) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 10) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 11) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 12) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 13) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 14) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 15) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 16) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 17) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 18) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 19) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 20) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 21) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 22) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 23) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 24) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 25) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 26) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 27) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 28) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 29) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 30) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 31) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ КОЛИЧЕСТВО(ДниМесяца.ДатаМесяца) КАК ДатаМесяца ИЗ ДниМесяца КАК ДниМесяца ГДЕ НАЧАЛОПЕРИОДА(ДниМесяца.ДатаМесяца, МЕСЯЦ) = НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ) И ДЕНЬНЕДЕЛИ(ДниМесяца.ДатаМесяца) <= 5  | 
|||
| 
    20
    
        GenV    
     19.10.13 
            ✎
    19:21 
 | 
         
        (19) Можно это все сделать в одном выражении     
         | 
|||
| 
    21
    
        МихаилМ    
     20.10.13 
            ✎
    11:51 
 | 
         
        хорошая задача на проверку профпригодности.     
         | 
|||
| 
    22
    
        mrDSide    
     20.10.13 
            ✎
    12:59 
 | 
         
        Високосный год?
 
        В мае (условно) 2012 и 2013 разное кол-во рабочих дней (условно). ДОБАВЬТЕ ПРОИЗВОДСТВЕННЫЙ КАЛЕНДАРЬ И НЕ ЗАНИМАЙТЕСЬ ЕРУНДОЙ.  | 
|||
| 
    23
    
        hhhh    
     20.10.13 
            ✎
    13:01 
 | 
         
        (22) в (19) всё это учтено     
         | 
|||
| 
    24
    
        GenV    
     20.10.13 
            ✎
    17:33 
 | 
         
        (22) Вообще то, производственный календарь для данной задачи совсем не нужен ...     
         | 
|||
| 
    25
    
        Мимохожий Однако    
     20.10.13 
            ✎
    19:49 
 | 
         
        Достаточно анализировать первые четыре дня, т.к. для 28 дней всегда будет 20 рабочих дней.     
         | 
|||
| 
    26
    
        mrDSide    
     20.10.13 
            ✎
    21:10 
 | 
         
        (25) а четыре для откуда Вы предлагаете анализировать? (10) с (24) - откуда Вы предлагаете брать день недели?
 
        Представляю себе бухгалтера: -введите первый день недели... -введите количество "красных" дней календаря без учета обычных выходных... -введите количество перенесенных рабочих дней (предпраздничный на пятницу следующей недели, а следующая неделя - это уже новый месяц; или такое бывает только у нас в РБ?). Делайте нормальный производственный календарь, тем более что загрузить можно с гос. сайта какого-нибудь. Пишите процедуры заполнения. ВСЕ РАВНО К ЭТОМУ ПРИДЕТЕ.  | 
|||
| 
    27
    
        GenV    
     20.10.13 
            ✎
    22:00 
 | 
         
        (26) Читай условие задачи в (6) ...     
         | 
|||
| 
    28
    
        mrDSide    
     20.10.13 
            ✎
    22:59 
 | 
         
        (27) красные дни календаря и переносы как не крути учитывать надо. Думай головой.     
         | 
|||
| 
    29
    
        GenV    
     20.10.13 
            ✎
    23:05 
 | 
         
        (28) Про красные дни уже уточнили в самом начале - их не надо учитывать! Советую почитать начало обсуждения...     
         | 
|||
| 
    30
    
        Aprobator    
     20.10.13 
            ✎
    23:14 
 | 
         
        первое, что приходит в голову - отдать в запрос ТЗ с датами месяца. А там - дело техники.     
         | 
|||
| 
    31
    
        mrDSide    
     20.10.13 
            ✎
    23:41 
 | 
         
        (29) Любезный там ясно написано - "без выходных", а то что дальше "(суббота, воскресенье)" - это только в самом общем случае всегда только эти дни являются выходными.     
         | 
|||
| 
    32
    
        GenV    
     20.10.13 
            ✎
    23:45 
 | 
         
        (31) Не тупи. И в (0) и в (6) ясно написано что выкидывать только воскресенье. в (3) объяснили, что это не типовая конфа и производственного календаря нет. в (1) и поз же спросили про производственный календарь.
 
        ЗЫ Но ты можешь решать свою задачу - я не против )  | 
|||
| 
    33
    
        mrDSide    
     21.10.13 
            ✎
    00:14 
 | 
         
        (32) вот именно, не тупи, там нигде не написано что не должно быть производственного календаря (писал я именно что надо добавить). ЧИТАЙ, ЧТО ЛЮДИ ПИШУТ.     
         | 
|||
| 
    34
    
        GenV    
     21.10.13 
            ✎
    00:26 
 | 
         
        (33) (33) Написано :))) "Выкидываем только субботу и воскресение". Про праздничные дни не слова. Или у тебя где-то обман зрения :)     
         | 
|||
| 
    35
    
        GenV    
     21.10.13 
            ✎
    00:35 
 | 
         
        43+ далее читаем обсуждение с моими высказываниями )
 
        (24) Я календарь не нужен (26) "-введите количество "красных" дней календаря без учета обычных выходных." - Зачем?? "ВСЕ РАВНО К ЭТОМУ ПРИДЕТЕ." - Зачем, если как я и на писал он не нужен и к нему !точно не придем!, т.к. уже выложили решение без него??? (28) красные дни календаря и переносы как не крути учитывать надо. - Зачем ??? ЗЫ Т.ч. я то читать умею )  | 
|||
| 
    36
    
        mrDSide    
     21.10.13 
            ✎
    00:35 
 | 
         
        а как тебе это, умник: "возвращает количество дней в месяце без выходных (субботы, воскресенья)". Работаешь по праздникам? Когда рабочий день переносят учитывать не надо это?     
         | 
|||
| 
    37
    
        GenV    
     21.10.13 
            ✎
    00:36 
 | 
         
        (36) Нет, по условию задачи праздники не учитываются, умник )     
         | 
|||
| 
    38
    
        mrDSide    
     21.10.13 
            ✎
    00:37 
 | 
         
        (37) Любезный, объясните мне - лоху такому - что такое рабочие дни, если пишу ересь.     
         | 
|||
| 
    39
    
        GenV    
     21.10.13 
            ✎
    00:39 
 | 
         
        (38) Где ты увидел слова "рабочие дни"? Задача "количество дней в месяце без выходных (субботы, воскресенья)" и еще раз "Выкидываем только субботу и воскресение".     
         | 
|||
| 
    40
    
        mrDSide    
     21.10.13 
            ✎
    00:57 
 | 
         
        ну да с учетом (6) вполне достаточно
 
        Дни=0;КонМ=КонецМесяца(НужнаяДата); Пока НужнаяДата<=КонМ Цикл Дни=Дни + ?(ДеньНедели(НужнаяДата)<6,1,0); НужнаяДата = НужнаяДата + 86400; КонецЦикла; Возврат Дни если запихнуть в гл.модуль, то в СКД можно использовать. А вот для запроса придется просто создавать таблицу, как и было написано выше, и передавать в параметры.  | 
|||
| 
    41
    
        mrDSide    
     21.10.13 
            ✎
    00:58 
 | 
         
        (39) Просто смысла тогда нету в этом никакого, т.к. для реального учета это 100% не годиться.     
         | 
|||
| 
    42
    
        mrDSide    
     21.10.13 
            ✎
    01:00 
 | 
         
        (40) а еще лучше в параметры передавать возвращаемое значение функции с этим кодом. Тогда везде можно будет использовать))     
         | 
|||
| 
    43
    
        mrDSide    
     21.10.13 
            ✎
    01:01 
 | 
         
        (40) ну и дописать перед "Пока" следующее: "НужнаяДата=НачалоМесяца(НужнаяДата);"
 
        =)  | 
|||
| 
    44
    
        GenV    
     21.10.13 
            ✎
    01:01 
 | 
         
        (41) Скорее всего это тестовая задача на знание запросов, т.к. решать её полностью в запросе тоже нет особого смысла     
         | 
|||
| 
    45
    
        mrDSide    
     21.10.13 
            ✎
    01:18 
 | 
         
        (44) Так в том и дело, что язык предназначен для получения данных из таблиц (ну или любых др. коллекций).     
         | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |