РазностьДат()

1. Zircool 297 02.06.12 14:00 Сейчас в теме
Добрый день! Подскажите как реализовать следующую задачу. Например у нас есть две даты:
05.05.2012 23:40 и 08.05.2012 08:00 нужно получить разность дат в часах, причем если в состав даты входят полные сутки, то брать не 24 часа а 20. Как такое можно реализовать?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. bzmax 02.06.12 14:23 Сейчас в теме
(1) Zircool,
Все не просто, а очень просто.
Разность дат - это секунды, т.е. когда из одной даты вычитаешь другую получаешь диапазон между ними в секундах.
допустим это "Х".
В часах У=Цел(Х/3600); - получаем диапазон в целых часах (ну тут можно и округление добавить т.е. если дробная часть больше 0.5 часа то увеличиваем на час больше).
Теперь нужно понять сколько цельных суток в этом диапазоне.
Z = Цел(Y/24);
И определяем оставшийся "хвостик" в часах (неполные сутки)
N = У - Z*24;
Т.к. в сутках мы решили что у нас 20 часов, то можем рассчитать диапазон в часах в "неземных" сутках.
h = Z*20+N;

Сами формулы можешь нарисовать красивей. Но ход мыслей расчета я думаю понятен.
3. YNik 02.06.12 14:31 Сейчас в теме
Часов = (Дата2 - Дата1) / 3600;
Результат = Цел(Часов / 24) * 20 + Часов % 24;
user919191; Zircool; +2 Ответить
4. Zircool 297 02.06.12 15:24 Сейчас в теме
А как в запросе можно эту конструкцию прописать?
6. bzmax 02.06.12 16:29 Сейчас в теме
(4) Zircool,
Вот с этого и надо было начинать.
Берем разность дат в часах и отнимаем разность дат в днях с погрешностью в 4 часа (т.к. нам нужно в сутках 20 часов).
строка в запросе будет выглядеть следующим образом

РАЗНОСТЬДАТ(Дата1, Дата2, ЧАС) - РАЗНОСТЬДАТ(Дата1, Дата2, ДЕНЬ) * 4 КАК ЧасыВМарсианскихСутках

где Дата1 - начало периода, Дата2 - конец периода.
(Ну описание для переменной можешь придумать посерьезней) :)
5. Zircool 297 02.06.12 16:23 Сейчас в теме
Здесь немного другая ситуация. Смотрите например у нас 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 часов.
7. bzmax 02.06.12 16:37 Сейчас в теме
(5) Zircool,
От блин! Что ж ты как пользователь!?
Нужную вводную информацию по частям выдаешь?
Надо было сразу описание задачи написать. (полностью)

Алгоритм описанный выше (для запроса) имеет только одну маленькую погрешность.

Расчет именно того самого "хвостика".
Т.е. когда сутки были полные... тут и гадать не стоит берем за аксиому что когда полные сутки то 24-4 = 20 часов.
А вот если тот самый преславутый "хвостик" те самые последние часы последних суток.
Тут нужно добавить следующее:
Если "хвостик" по часам меньше 20, то оставляем как есть, а если больше то вместо него ставим 20 часов.
8. brunhilda 02.06.12 16:50 Сейчас в теме
Сначала считаем количество полных суток:

ВторойДень = НачалоДня(Дата1)+ 86400.

КоличествоСуток = (НачалоДня(Дата2)-ВторойДень)/86400.

ХвостикВНачале = (ВторойДень - Дата1)/3600;
ХвостикВКонце = (Дата2-НачалоДня(Дата2))/3600;

ИскомоеЧисло = КоличествоСуток*20+ХвостикВначале+ХвостикВКонце.

(округляй либо конечный результат, либо промежуточный)
10. bzmax 02.06.12 16:56 Сейчас в теме
(8) brunhilda,
Если для данной задачи. Точкой перевала суток будет время именно 00:00
То твой алгоритм правильней чем мой.

Если точкой перевала суток считать время в составе первой даты(начало периода), то достаточно моего.

Но по уму, твой алгоритм правильней.
Сутки все таки начинаются с 00:00 и поэтому всегда будет "предхвостик" в начале перед следующими полными сутками.
Но если у них в сутках 20 часов, то фиг его знает с какого времени у них сутки начинаются :)
9. bzmax 02.06.12 16:51 Сейчас в теме
При твоих условиях и в запросе это будет выглядеть так:

РАЗНОСТЬДАТ(Дата1, Дата2, ДЕНЬ) * 20 +
ВЫБОР
КОГДА РАЗНОСТЬДАТ(Дата1, Дата2, ЧАС) - РАЗНОСТЬДАТ(ПоступлениеТоваров.Дата, &Дата1, ДЕНЬ) * 24 > 20 ТОГДА 20
ИНАЧЕ РАЗНОСТЬДАТ(Дата1, Дата2, ЧАС) - РАЗНОСТЬДАТ(ПоступлениеТоваров.Дата, &Дата1, ДЕНЬ) * 24
КОНЕЦ
КАК ЧасыВМарсианскихСутках
11. пользователь 02.06.12 17:26
Сообщение было скрыто модератором.
...
12. Zircool 297 02.06.12 17:39 Сейчас в теме
Ребят спасибо за помощь, в датах у меня большой пробел)))

Использовал алгоритм от brunhilda. С следующими датами неправильно ведет рассчет.

02.05.2012 8:00:00 | 02.05.2012 20:00:00 | 16,00
13. Zircool 297 02.06.12 18:11 Сейчас в теме
Сделал так:


Дата1 = Выборка.ДатаВыезда;
Дата2 = Выборка.ДатаВозвращения;

Если НачалоДня(Дата1) = НачалоДня(Дата2) Тогда

Результат = (Выборка.ДатаВозвращения - Выборка.ДатаВыезда) /3600;
Если Результат > 20 Тогда
Результат = 20;
КонецЕсли;

ЗП = Результат * 77;


Иначе

ВторойДень = НачалоДня(Дата1)+ 86400;
КоличествоСуток = (НачалоДня(Дата2)-ВторойДень)/86400;

ХвостикВНачале = (ВторойДень - Дата1)/3600;
ХвостикВКонце = (Дата2-НачалоДня(Дата2))/3600;

Результат = КоличествоСуток*20+ХвостикВначале+ХвостикВКонце;
ЗП = Результат * 77;

КонецЕсли;


Показать
16. bimy22 01.04.19 14:52 Сейчас в теме
(13) Забавно, но я думала вы данные расчёты прям в запросе рассчитывать собираетесь!) Спасибо, что выложили итоговый вариант решения)
14. Aitbay 30.11.18 09:11 Сейчас в теме
вот сюда добавить учет дней

Функция ПредставлениеВремени(Знач Секунд) Экспорт
	
	Если НЕ ЗначениеЗаполнено(Секунд) Тогда
		Возврат "";
	КонецЕсли;
	
	Если ТипЗнч(Секунд) <> Тип("Число") Тогда
		Секунд = ?(ПустаяСтрока(Секунд), 0, Число(Секунд));
	КонецЕсли; 
	
	Часов  = Цел(Секунд / 3600);
	Минут  = Цел((Секунд % 3600) / 60);
	Секунд = Цел(Секунд % 60);
	
	Если Часов = 0 И Минут = 0 Тогда
		Возврат Строка(Секунд) + " с"; 
	ИначеЕсли Часов = 0 И Минут > 0 Тогда
		Возврат Строка(Минут) + " м " + Формат(Секунд, "ЧЦ=2; ЧН=00; ЧВН=") + " с"; 
	Иначе
		Возврат Строка(Часов) + " ч " + Формат(Минут, "ЧЦ=2; ЧН=00; ЧВН=") + " м " + Формат(Секунд, "ЧЦ=2; ЧН=00; ЧВН=") + " с";
	КонецЕсли;
	
КонецФункции
Показать
15. Manticor 66 22.03.19 17:43 Сейчас в теме
(14)
Функция ПредставлениеВремени(Знач Секунд) Экспорт

Если НЕ ЗначениеЗаполнено(Секунд) Тогда
Возврат "";
КонецЕсли;

Если ТипЗнч(Секунд) <> Тип("Число") Тогда
Секунд = ?(ПустаяСтрока(Секунд), 0, Число(Секунд));
КонецЕсли;

Часов = Цел(Секунд / 3600);
Минут = Цел((Секунд % 3600) / 60);
Секунд = Цел(Секунд % 60);

Если Часов = 0 И Минут = 0 Тогда
Возврат Строка(Секунд) + " с";
ИначеЕсли Часов = 0 И Минут > 0 Тогда
Возврат Строка(Минут) + " м " + Формат(Секунд, "ЧЦ=2; ЧН=00; ЧВН=") + " с";
Иначе
Возврат Строка(Часов) + " ч " + Формат(Минут, "ЧЦ=2; ЧН=00; ЧВН=") + " м " + Формат(Секунд, "ЧЦ=2; ЧН=00; ЧВН=") + " с";
КонецЕсли;

КонецФункции
Показать


Напишите пожалуйста - как еще и по дням будет считаться? Очень нужно)
17. sinops 26.11.23 15:12 Сейчас в теме
Вдруг кому пригодиться
Можно использовать механизм
РазностьДатаВремя = Дата(1,1,1) + (Дата1 - Дата2);
user1252779; aairt; +2 Ответить
18. Said-We 27.11.23 15:58 Сейчас в теме
(16) Думаю в запросе тоже можно. Задача похожа на расчет рабочих дней без субботы и воскресенья без учета праздников. Но тут даже проще полные сутки как 20 часов (1200 минут) хвостики как есть.
Надо посчитать целых дней между датами * 20 часов + хвостики как есть.
19. Said-We 27.11.23 23:30 Сейчас в теме
(1) А в таком случае, сколько должно получаться?
С 01.01.2023 01:00:00 по 03.01.2023 23:00:00 = ?
2 дня (20-ти часовых) и ещё 22 часа? Или как-то иначе?
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот