Есть 3 текстовых даты. Дата начала, дата конца, проверяемая дата.
Каждая дата состоит из месяца и года. Например 08.2016.
Как определить вхождение проверяемой даты, в интервал даты начала и даты конца? Включительно.
То есть Дата начала<=Проверяемая дата<=Дата конца
logpol32: И сразу в догонку:
startd <= currd <= endd неверно с точки зрения логики.
К примеру после вычисления первого равенства сравниваем уже не даты:
startd <= currd ---> тип булеан, а булеан не сравним ни с чем (напрямую).
В с++ такое могло бы пройти, но все равно результат вероятнее всего будет нелогичен.
alex_ak1: Это псевдокод. Можно считать математическим выражением.
В вашем коде выше присутствуют дни. Разумеется, добавить дни, не составит труда.
Но по моему не стоит производить лишние операции добавления дней, перевод в дату.
Неужели нельзя просто сравнить числа?
logpol32: Можно пойти простым путем, взяв чужой стабильный велосипед, а можно изобрести свой велосипед - выбор ваш.
Если хочется новый свежий велосипед - переведите ваши месяц_год в "количество месяцев с чего-то там" и сравнивайте. Условие сильно проще будет, если же не переводить - сранивать 2 пары чисел это условие на штук 6 сравнений. Сравниваем годы (2 штуки), если не выяснили - сравниваем месяца. Долго и неочевидно.
alex_ak1: Велосипеды )... нет всё правильно написали. Но в вашем коде меня смущают дни.
В условиях задачи дней нет. Повлияет ли это на сравнение?
И года - strtodate('25/04/20'); - это что за дата? 2020 или 1920.
Слишком много вопросов.
Я же упростил задачу до банального сравнения цифр - год, месяц.
logpol32: Упрощение путем усложнения? :))) А так - да как вам угодно :) Можно и только с месяцами работать, разницы-то. Ну или к примеру strtodate( '01/' + edit1.text );
Или функцию написать какую самопальную.
Используйте DateInRange вместо сравнений.
Если понадобится добавить дни, то в языке всё уже реализовано. К начальной дате примените StartOfTheMonth, к конечной EndOfTheMonth.
logpol32: Ну функция DateInRange здесь чисто для красы :) Она никаких чудес не делает:
function DateInRange(ADate: TDate; AStartDate, AEndDate: TDate; AInclusive: Boolean = True): Boolean;
begin
if AInclusive then
Result := (DateOf(AStartDate) <= DateOf(ADate)) and (DateOf(ADate) <= DateOf(AEndDate))
else
Result := (DateOf(AStartDate) < DateOf(ADate)) and (DateOf(ADate) < DateOf(AEndDate));
end;
А строки Ваши по-любому надо во что-то более удобное для сравнения преобразовать. Совсем без телодвижений никак не обойтись. Всё зависит от формата входных данных - известен ли он Вам и постоянен ли он. Если формат всех трёх дат такой, как написано в вопросе, то я бы добавил в начале строки '01.' а дальше StrToDate и сравнивайте на здоровье.