|
Количество дней до события
|
|||
---|---|---|---|
#18+
? (date(2009, 5, 31)-date()) %365 < 30 && да ? (date(1987, 5, 31)-date()) %365 < 30 && да ? (date(1900, 7, 31)-date()) %365 < 30 && нет ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2009, 14:11 |
|
Количество дней до события
|
|||
---|---|---|---|
#18+
alextashk? (date(2009, 5, 31)-date()) %365 < 30 && да ? (date(1987, 5, 31)-date()) %365 < 30 && да ? (date(1900, 7, 31)-date()) %365 < 30 && нет Решение соблазнительно простое. Однако, это решение не учитывает все те же високосные года. Сегодня - 02.05.2009 Дата - 31.05.1987 - до 2009 было 88, 92, 96, 2000, 04, 08 - 6 високосных лет, когда количество дней в году было не 365, а 366. Это значит, что деление на 365 дает ошибку в 6 дней в сторону увеличения остатка от деления. Но, поскольку здесь используются отрицательные величины, то произойдет не увеличение, а уменьшение остатка от деления. Т.е. разница будет не 29 дней, как ожидалось, а 23 дня В данном случае - без разницы. Все равно ведь попали, но если взять даты Код: plaintext
Ничего себе! 6 июня отстоит от 2 мая меньше, чем на 30 дней! К сожалению, использовать в качестве основания вместо 365 значение 365,25 не получится, поскольку в этом случае сложно сказать, каков будет результат округления для интервалов, меньше 4 лет. Поэтом, логично просто рассчитать количество лет (по 365 дней) и поделив это значение на 4 внести поправку. Код: plaintext
Почему надо брать ближайшее большее (для отрицательных чисел ближайшее меньшее)? Ну, потому, что если интервал между датами, составляет, например, 5 лет, то в него попало 2 високосных года, а не 1, как получится если взять просто целую часть от деления 5/4. Если интервал составил ровно 4 года, то в него попал только один високосный год, поскольку считаем "года" состоящие из 365 дней. Разумеется, этот алгоритм даст ошибку, если интервал дат больше, чем 365 лет. Но, не думаю, что в этом случае кто-то будет определять дату рождения. В общем, решение простое только на первый взгляд. Если доводить его до завершения, то оно становится не такое уж и простое и далеко не очевидное. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2009, 17:32 |
|
Количество дней до события
|
|||
---|---|---|---|
#18+
В данном случае - без разницы. Все равно ведь попали, но если взять даты ? (date(1987, 6, 6)-date()) % 365 < 30 && да Ничего себе! 6 июня отстоит от 2 мая меньше, чем на 30 дней! ? dodobday({^1987.06.06},{^2009.05.02}) 35 дней * здесь меняем год в дате рождения на текущий d3= LTRIM(STR(YEAR(d2))) + RIGHT(DTOC(d1,1),4) d3= CTOD('^'+LEFT(d3,4)+'.'+SUBSTR(d3,5,2)+'.'+RIGHT(d3,2)) IF (d3-d2)<0 & проверка событие уже прошло в этом году? * если да, прибавляем к текущему еще один год d3= LTRIM(STR(YEAR(d2)+1)) + RIGHT(DTOC(d1,1),4) d3= CTOD('^'+LEFT(d3,4)+'.'+SUBSTR(d3,5,2)+'.'+RIGHT(d3,2)) ENDIF * возвращаем разницу дней RETURN d3-d2 и поскольку используется стандартная операция вычитания из большей даты меньшую, то и считает все правильно, в том числе и с високосными годами все в порядке ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2009, 08:57 |
|
Количество дней до события
|
|||
---|---|---|---|
#18+
ВладимирМ, Да Вы правы, поэтому, с учётом требования найти людей с датами дней рождений, отстоящими от текущей даты, на менее 30 дней можно использовать следующую функцию ? (date(YEAR(DATE()), 5, 31)-date()) %365 < 30 && да ? (date(YEAR(DATE()), 5, 31)-date()) %365 < 30 && да ? (date(YEAR(DATE()), 7, 31)-date()) %365 < 30 && нет ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2009, 19:50 |
|
Количество дней до события
|
|||
---|---|---|---|
#18+
Ребята, я понимаю, "в лом" читать все то, что уже было понаписано на эту тему. Но ведь вы буквально шаг-в-шаг наступаете на все те же грабли, про которые уже было сказано не однократно. Проблема в формировании значения даты из "слагаемых" заключается в том, что далеко не факт, что в результате получится корректное выражение даты. Возможна ошибка с разными последствиями. Для примера Код: plaintext 1. 2. 3.
Кроме того, если подставлять в дату значения текущего года, то напарываемся на проблему перехода через год. Это когда день рождения, скажем 31 декабря, а сегодня 1 января. Имеем Код: plaintext
Ну, пожалуйста, прежде, чем опять что-то писать, ПРОЧИТАЙТЕ то, что уже обсуждалось до вас. Ведь все это уже БЫЛО. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2009, 20:41 |
|
Количество дней до события
|
|||
---|---|---|---|
#18+
ВладимирМРебята, я понимаю, "в лом" читать все то, что уже было понаписано на эту тему. Но ведь вы буквально шаг-в-шаг наступаете на все те же грабли, про которые уже было сказано не однократно. Проблема в формировании значения даты из "слагаемых" заключается в том, что далеко не факт, что в результате получится корректное выражение даты. Возможна ошибка с разными последствиями. Для примера Код: plaintext 1. 2. 3.
Кроме того, если подставлять в дату значения текущего года, то напарываемся на проблему перехода через год. Это когда день рождения, скажем 31 декабря, а сегодня 1 января. Имеем Код: plaintext
Ну, пожалуйста, прежде, чем опять что-то писать, ПРОЧИТАЙТЕ то, что уже обсуждалось до вас. Ведь все это уже БЫЛО. С датой 29 февраля действительно проблема, но второй указанный случай, в котором вы противоречите себе, т.к. если дата рождения 31 декабря, а сегодня 1 января, то это значит что родился он как минимум в прошлом году, а не в текущем, и до его дня рождения 364 дня, все правильно. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2009, 10:49 |
|
Количество дней до события
|
|||
---|---|---|---|
#18+
той С датой 29 февраля действительно проблема, но второй указанный случай, в котором вы противоречите себе, т.к. если дата рождения 31 декабря, а сегодня 1 января, то это значит что родился он как минимум в прошлом году, а не в текущем, и до его дня рождения 364 дня, все правильно. Действительно, забыл, что рассматривается "будущая" дата. Т.е. определяется не просто "интервал", а "направленный интервал". В этом случае, при расчете остатка от деления на 365 проблемы "перехода через год" нет. Но остается проблема високосных лет. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2009, 11:53 |
|
|
start [/forum/topic.php?fid=41&gotonew=1&tid=1586498]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
46ms |
get topic data: |
8ms |
get first new msg: |
7ms |
get forum data: |
2ms |
get page messages: |
96ms |
get tp. blocked users: |
1ms |
others: | 10ms |
total: | 199ms |
0 / 0 |