По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Zircool,
Все не просто, а очень просто.
Разность дат - это секунды, т.е. когда из одной даты вычитаешь другую получаешь диапазон между ними в секундах.
допустим это "Х".
В часах У=Цел(Х/3600); - получаем диапазон в целых часах (ну тут можно и округление добавить т.е. если дробная часть больше 0.5 часа то увеличиваем на час больше).
Теперь нужно понять сколько цельных суток в этом диапазоне.
Z = Цел(Y/24);
И определяем оставшийся "хвостик" в часах (неполные сутки)
N = У - Z*24;
Т.к. в сутках мы решили что у нас 20 часов, то можем рассчитать диапазон в часах в "неземных" сутках.
h = Z*20+N;
Сами формулы можешь нарисовать красивей. Но ход мыслей расчета я думаю понятен.
Все не просто, а очень просто.
Разность дат - это секунды, т.е. когда из одной даты вычитаешь другую получаешь диапазон между ними в секундах.
допустим это "Х".
В часах У=Цел(Х/3600); - получаем диапазон в целых часах (ну тут можно и округление добавить т.е. если дробная часть больше 0.5 часа то увеличиваем на час больше).
Теперь нужно понять сколько цельных суток в этом диапазоне.
Z = Цел(Y/24);
И определяем оставшийся "хвостик" в часах (неполные сутки)
N = У - Z*24;
Т.к. в сутках мы решили что у нас 20 часов, то можем рассчитать диапазон в часах в "неземных" сутках.
h = Z*20+N;
Сами формулы можешь нарисовать красивей. Но ход мыслей расчета я думаю понятен.
(4) Zircool,
Вот с этого и надо было начинать.
Берем разность дат в часах и отнимаем разность дат в днях с погрешностью в 4 часа (т.к. нам нужно в сутках 20 часов).
строка в запросе будет выглядеть следующим образом
РАЗНОСТЬДАТ(Дата1, Дата2, ЧАС) - РАЗНОСТЬДАТ(Дата1, Дата2, ДЕНЬ) * 4 КАК ЧасыВМарсианскихСутках
где Дата1 - начало периода, Дата2 - конец периода.
(Ну описание для переменной можешь придумать посерьезней) :)
Вот с этого и надо было начинать.
Берем разность дат в часах и отнимаем разность дат в днях с погрешностью в 4 часа (т.к. нам нужно в сутках 20 часов).
строка в запросе будет выглядеть следующим образом
РАЗНОСТЬДАТ(Дата1, Дата2, ЧАС) - РАЗНОСТЬДАТ(Дата1, Дата2, ДЕНЬ) * 4 КАК ЧасыВМарсианскихСутках
где Дата1 - начало периода, Дата2 - конец периода.
(Ну описание для переменной можешь придумать посерьезней) :)
Здесь немного другая ситуация. Смотрите например у нас 2 даты:
02.05.2012 20:00:00 и 03.05.2012 20:10:00
Получается что второго числа человек отработал 4 часа а третьего 20 часов в сумме должено получиться 24 часа, а в отчете пишет 20, т.к. 24 принимает за 20. Должно идти сокращение до 20 часов, если это сутки. Т.е. если человек отработал бы 3.05.2012 23 часа, должно взяться 20 часов.
02.05.2012 20:00:00 и 03.05.2012 20:10:00
Получается что второго числа человек отработал 4 часа а третьего 20 часов в сумме должено получиться 24 часа, а в отчете пишет 20, т.к. 24 принимает за 20. Должно идти сокращение до 20 часов, если это сутки. Т.е. если человек отработал бы 3.05.2012 23 часа, должно взяться 20 часов.
(5) Zircool,
От блин! Что ж ты как пользователь!?
Нужную вводную информацию по частям выдаешь?
Надо было сразу описание задачи написать. (полностью)
Алгоритм описанный выше (для запроса) имеет только одну маленькую погрешность.
Расчет именно того самого "хвостика".
Т.е. когда сутки были полные... тут и гадать не стоит берем за аксиому что когда полные сутки то 24-4 = 20 часов.
А вот если тот самый преславутый "хвостик" те самые последние часы последних суток.
Тут нужно добавить следующее:
Если "хвостик" по часам меньше 20, то оставляем как есть, а если больше то вместо него ставим 20 часов.
От блин! Что ж ты как пользователь!?
Нужную вводную информацию по частям выдаешь?
Надо было сразу описание задачи написать. (полностью)
Алгоритм описанный выше (для запроса) имеет только одну маленькую погрешность.
Расчет именно того самого "хвостика".
Т.е. когда сутки были полные... тут и гадать не стоит берем за аксиому что когда полные сутки то 24-4 = 20 часов.
А вот если тот самый преславутый "хвостик" те самые последние часы последних суток.
Тут нужно добавить следующее:
Если "хвостик" по часам меньше 20, то оставляем как есть, а если больше то вместо него ставим 20 часов.
Сначала считаем количество полных суток:
ВторойДень = НачалоДня(Дата1)+ 86400.
КоличествоСуток = (НачалоДня(Дата2)-ВторойДень)/86400.
ХвостикВНачале = (ВторойДень - Дата1)/3600;
ХвостикВКонце = (Дата2-НачалоДня(Дата2))/3600;
ИскомоеЧисло = КоличествоСуток*20+ХвостикВначале+ХвостикВКонце.
(округляй либо конечный результат, либо промежуточный)
ВторойДень = НачалоДня(Дата1)+ 86400.
КоличествоСуток = (НачалоДня(Дата2)-ВторойДень)/86400.
ХвостикВНачале = (ВторойДень - Дата1)/3600;
ХвостикВКонце = (Дата2-НачалоДня(Дата2))/3600;
ИскомоеЧисло = КоличествоСуток*20+ХвостикВначале+ХвостикВКонце.
(округляй либо конечный результат, либо промежуточный)
(8) brunhilda,
Если для данной задачи. Точкой перевала суток будет время именно 00:00
То твой алгоритм правильней чем мой.
Если точкой перевала суток считать время в составе первой даты(начало периода), то достаточно моего.
Но по уму, твой алгоритм правильней.
Сутки все таки начинаются с 00:00 и поэтому всегда будет "предхвостик" в начале перед следующими полными сутками.
Но если у них в сутках 20 часов, то фиг его знает с какого времени у них сутки начинаются :)
Если для данной задачи. Точкой перевала суток будет время именно 00:00
То твой алгоритм правильней чем мой.
Если точкой перевала суток считать время в составе первой даты(начало периода), то достаточно моего.
Но по уму, твой алгоритм правильней.
Сутки все таки начинаются с 00:00 и поэтому всегда будет "предхвостик" в начале перед следующими полными сутками.
Но если у них в сутках 20 часов, то фиг его знает с какого времени у них сутки начинаются :)
При твоих условиях и в запросе это будет выглядеть так:
РАЗНОСТЬДАТ(Дата1, Дата2, ДЕНЬ) * 20 +
ВЫБОР
КОГДА РАЗНОСТЬДАТ(Дата1, Дата2, ЧАС) - РАЗНОСТЬДАТ(ПоступлениеТоваров.Дата, &Дата1, ДЕНЬ) * 24 > 20 ТОГДА 20
ИНАЧЕ РАЗНОСТЬДАТ(Дата1, Дата2, ЧАС) - РАЗНОСТЬДАТ(ПоступлениеТоваров.Дата, &Дата1, ДЕНЬ) * 24
КОНЕЦ
КАК ЧасыВМарсианскихСутках
РАЗНОСТЬДАТ(Дата1, Дата2, ДЕНЬ) * 20 +
ВЫБОР
КОГДА РАЗНОСТЬДАТ(Дата1, Дата2, ЧАС) - РАЗНОСТЬДАТ(ПоступлениеТоваров.Дата, &Дата1, ДЕНЬ) * 24 > 20 ТОГДА 20
ИНАЧЕ РАЗНОСТЬДАТ(Дата1, Дата2, ЧАС) - РАЗНОСТЬДАТ(ПоступлениеТоваров.Дата, &Дата1, ДЕНЬ) * 24
КОНЕЦ
КАК ЧасыВМарсианскихСутках
Сделал так:
Дата1 = Выборка.ДатаВыезда;
Дата2 = Выборка.ДатаВозвращения;
Если НачалоДня(Дата1) = НачалоДня(Дата2) Тогда
Результат = (Выборка.ДатаВозвращения - Выборка.ДатаВыезда) /3600;
Если Результат > 20 Тогда
Результат = 20;
КонецЕсли;
ЗП = Результат * 77;
Иначе
ВторойДень = НачалоДня(Дата1)+ 86400;
КоличествоСуток = (НачалоДня(Дата2)-ВторойДень)/86400;
ХвостикВНачале = (ВторойДень - Дата1)/3600;
ХвостикВКонце = (Дата2-НачалоДня(Дата2))/3600;
Результат = КоличествоСуток*20+ХвостикВначале+ХвостикВКонце;
ЗП = Результат * 77;
КонецЕсли;
Показать
Дата1 = Выборка.ДатаВыезда;
Дата2 = Выборка.ДатаВозвращения;
Если НачалоДня(Дата1) = НачалоДня(Дата2) Тогда
Результат = (Выборка.ДатаВозвращения - Выборка.ДатаВыезда) /3600;
Если Результат > 20 Тогда
Результат = 20;
КонецЕсли;
ЗП = Результат * 77;
Иначе
ВторойДень = НачалоДня(Дата1)+ 86400;
КоличествоСуток = (НачалоДня(Дата2)-ВторойДень)/86400;
ХвостикВНачале = (ВторойДень - Дата1)/3600;
ХвостикВКонце = (Дата2-НачалоДня(Дата2))/3600;
Результат = КоличествоСуток*20+ХвостикВначале+ХвостикВКонце;
ЗП = Результат * 77;
КонецЕсли;
вот сюда добавить учет дней
Функция ПредставлениеВремени(Знач Секунд) Экспорт
Если НЕ ЗначениеЗаполнено(Секунд) Тогда
Возврат "";
КонецЕсли;
Если ТипЗнч(Секунд) <> Тип("Число") Тогда
Секунд = ?(ПустаяСтрока(Секунд), 0, Число(Секунд));
КонецЕсли;
Часов = Цел(Секунд / 3600);
Минут = Цел((Секунд % 3600) / 60);
Секунд = Цел(Секунд % 60);
Если Часов = 0 И Минут = 0 Тогда
Возврат Строка(Секунд) + " с";
ИначеЕсли Часов = 0 И Минут > 0 Тогда
Возврат Строка(Минут) + " м " + Формат(Секунд, "ЧЦ=2; ЧН=00; ЧВН=") + " с";
Иначе
Возврат Строка(Часов) + " ч " + Формат(Минут, "ЧЦ=2; ЧН=00; ЧВН=") + " м " + Формат(Секунд, "ЧЦ=2; ЧН=00; ЧВН=") + " с";
КонецЕсли;
КонецФункции
Показать
(14)
Напишите пожалуйста - как еще и по дням будет считаться? Очень нужно)
Функция ПредставлениеВремени(Знач Секунд) Экспорт
Если НЕ ЗначениеЗаполнено(Секунд) Тогда
Возврат "";
КонецЕсли;
Если ТипЗнч(Секунд) <> Тип("Число") Тогда
Секунд = ?(ПустаяСтрока(Секунд), 0, Число(Секунд));
КонецЕсли;
Часов = Цел(Секунд / 3600);
Минут = Цел((Секунд % 3600) / 60);
Секунд = Цел(Секунд % 60);
Если Часов = 0 И Минут = 0 Тогда
Возврат Строка(Секунд) + " с";
ИначеЕсли Часов = 0 И Минут > 0 Тогда
Возврат Строка(Минут) + " м " + Формат(Секунд, "ЧЦ=2; ЧН=00; ЧВН=") + " с";
Иначе
Возврат Строка(Часов) + " ч " + Формат(Минут, "ЧЦ=2; ЧН=00; ЧВН=") + " м " + Формат(Секунд, "ЧЦ=2; ЧН=00; ЧВН=") + " с";
КонецЕсли;
КонецФункции
ПоказатьЕсли НЕ ЗначениеЗаполнено(Секунд) Тогда
Возврат "";
КонецЕсли;
Если ТипЗнч(Секунд) <> Тип("Число") Тогда
Секунд = ?(ПустаяСтрока(Секунд), 0, Число(Секунд));
КонецЕсли;
Часов = Цел(Секунд / 3600);
Минут = Цел((Секунд % 3600) / 60);
Секунд = Цел(Секунд % 60);
Если Часов = 0 И Минут = 0 Тогда
Возврат Строка(Секунд) + " с";
ИначеЕсли Часов = 0 И Минут > 0 Тогда
Возврат Строка(Минут) + " м " + Формат(Секунд, "ЧЦ=2; ЧН=00; ЧВН=") + " с";
Иначе
Возврат Строка(Часов) + " ч " + Формат(Минут, "ЧЦ=2; ЧН=00; ЧВН=") + " м " + Формат(Секунд, "ЧЦ=2; ЧН=00; ЧВН=") + " с";
КонецЕсли;
КонецФункции
Напишите пожалуйста - как еще и по дням будет считаться? Очень нужно)
(16) Думаю в запросе тоже можно. Задача похожа на расчет рабочих дней без субботы и воскресенья без учета праздников. Но тут даже проще полные сутки как 20 часов (1200 минут) хвостики как есть.
Надо посчитать целых дней между датами * 20 часов + хвостики как есть.
Надо посчитать целых дней между датами * 20 часов + хвостики как есть.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот