|
Количество дней до события
|
|||
---|---|---|---|
#18+
Здраствуйте, есть в таблице поле (god_rojd) типа date хранящее дату рождения. Мне нужно узнать разницу в днях между текущей датой и датой рождения, разницу выводить в TextBox. Все это нужно для установки фильтра, на форме есть кнопка "Показать именинников", при нажатии на кнопку должен установиться фильтр отображающий людей у которых до дня рождения осталось менее 30 дней. Формат даты: SET DATE GERMAN ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2009, 17:31 |
|
Количество дней до события
|
|||
---|---|---|---|
#18+
Где то недавно это обсуждалось :-) На страницы так 2-е, 3-и. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2009, 17:35 |
|
Количество дней до события
|
|||
---|---|---|---|
#18+
thisform.txtDateRojd.Value = DATE()-date_rojd ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2009, 17:35 |
|
Количество дней до события
|
|||
---|---|---|---|
#18+
http://www.sql.ru/forum/actualthread.aspx?tid=649550 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2009, 17:40 |
|
Количество дней до события
|
|||
---|---|---|---|
#18+
AK-Shah, твой спосо не канает, потому что тут учитывается год разница между 1988 и 2008 годом составит примерно 7000 дней. в итоге я никогда неполучу при таком способе, что до дня рождения человеку осталось 30 дней. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2009, 18:07 |
|
Количество дней до события
|
|||
---|---|---|---|
#18+
GoshaShttp://www.sql.ru/forum/actualthread.aspx?tid=649550 Ненашол там именно для моего случая примера. Я ту тему два раза читал до того как создал свою. Там промежутки и тд и тп. А мне надо конкретное количество дней до дня рождения. Я недогнал как сделать через промежутки. Пытался даже: В данном случае Date() имеет значени 30.04.09, а plan_sotr.god_rojd имеет значение 03.06.1988 thisfotm.text21.value = RIGHT(DTOS(DATE()),4)-RIGHT(DTOS(plan_sotr.god_rojd),4) При выполнении в текстебоксе получаю: 04300603 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2009, 18:29 |
|
Количество дней до события
|
|||
---|---|---|---|
#18+
set date german set century on ? ? INT(((YEAR(DATE())-YEAR({^1972.05.17}))*365.25)-(DATE() - {^1972.05.17})) Ps. до моего дня рождения осталось .... ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2009, 21:27 |
|
Количество дней до события
|
|||
---|---|---|---|
#18+
DisaerЗдраствуйте, есть в таблице поле (god_rojd) типа date хранящее дату рождения. Мне нужно узнать разницу в днях между текущей датой и датой рождения, разницу выводить в TextBox. Все это нужно для установки фильтра, на форме есть кнопка "Показать именинников", при нажатии на кнопку должен установиться фильтр отображающий людей у которых до дня рождения осталось менее 30 дней. Формат даты: SET DATE GERMAN Это круто. TextBox.value=date()-god_rojd SET FILTER TO date()-god_rojd<30 Или надо с десяток ссылок в инете ? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2009, 21:55 |
|
Количество дней до события
|
|||
---|---|---|---|
#18+
Guest12345set date german set century on ? ? INT(((YEAR(DATE())-YEAR({^1972.05.17}))*365.25)-(DATE() - {^1972.05.17})) Ps. до моего дня рождения осталось .... Спасибо очень помогло. Только у меня тут пришлось поменять фигурные скобки на круглые. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2009, 21:57 |
|
Количество дней до события
|
|||
---|---|---|---|
#18+
rewareDisaerЗдраствуйте, есть в таблице поле (god_rojd) типа date хранящее дату рождения. Мне нужно узнать разницу в днях между текущей датой и датой рождения, разницу выводить в TextBox. Все это нужно для установки фильтра, на форме есть кнопка "Показать именинников", при нажатии на кнопку должен установиться фильтр отображающий людей у которых до дня рождения осталось менее 30 дней. Формат даты: SET DATE GERMAN Это круто. TextBox.value=date()-god_rojd SET FILTER TO date()-god_rojd<30 Или надо с десяток ссылок в инете ? Так как ты написал нереботает нехера!!! Так сгодится только если у тебя год рождения и текущий год одинаковы. А когда у тебя разница в 20 лет будет, ты никогда число <30 неполучишь. иди проверь если невериш. разница между датами 2009 года и 1988 года примерно равны 7000 дням. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2009, 22:00 |
|
Количество дней до события
|
|||
---|---|---|---|
#18+
Disaer[quot Guest12345]set date german set century on ? INT(((YEAR(DATE())-YEAR({^1972.05.17}))*365.25)-(DATE() - {^1972.05.17})) Ps. до моего дня рождения осталось .... Спасибо очень помогло. Только у меня тут пришлось поменять фигурные скобки на круглые.[/quot Только надо смотреть если результат положительный, то до текущего события осталось столько дней сколько получается, а если отрицательный, значит событие уже прошло, и не совсем наверно правильно показывает, ну мысль наверно можно поправить в нужном направлении ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2009, 22:14 |
|
Количество дней до события
|
|||
---|---|---|---|
#18+
Guest12345Disaer[quot Guest12345]set date german set century on ? INT(((YEAR(DATE())-YEAR({^1972.05.17}))*365.25)-(DATE() - {^1972.05.17})) Ps. до моего дня рождения осталось .... Спасибо очень помогло. Только у меня тут пришлось поменять фигурные скобки на круглые.[/quot Только надо смотреть если результат положительный, то до текущего события осталось столько дней сколько получается, а если отрицательный, значит событие уже прошло, и не совсем наверно правильно показывает, ну мысль наверно можно поправить в нужном направлении Угу в некоторых случаях получается отрицательный ответ, поэтому я к этому результату длаю проверку. d = INT(((YEAR(DATE())-YEAR((plan_sotr.god_rojd)))*365.25)-(DATE() - (plan_sotr.god_rojd))) IF d>=0 thisform.text21.Value = d ELSE thisform.text21.Value = d+365 ENDIF ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2009, 22:26 |
|
Количество дней до события
|
|||
---|---|---|---|
#18+
Disaer Угу в некоторых случаях получается отрицательный ответ, поэтому я к этому результату длаю проверку. d = INT(((YEAR(DATE())-YEAR((plan_sotr.god_rojd)))*365.25)-(DATE() - (plan_sotr.god_rojd))) IF d>=0 thisform.text21.Value = d ELSE thisform.text21.Value = d+365 ENDIF Да, так в целом почти правильно, только 1 следующий день после рождения неправильно показывает 0 дней, а все остальные дни нормально12345 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2009, 22:34 |
|
Количество дней до события
|
|||
---|---|---|---|
#18+
Думаю так правильно будет SET TALK OFF SET DATE GERMAN SET CENTURY on CLEAR mydata={^1972.05.17} d1=INT(((YEAR(DATE())-YEAR(mydata))*365.25)-(DATE() - mydata)) IF d1>0 d2 = d1 ELSE IF d1=0 IF DAY(mydata)=DAY(DATE()) d2=0 ELSE d2=365 ENDIF ELSE d2 = d1+365 ENDIF ENDIF MESSAGEBOX('До моего дня рождения осталось:'+ALLTRIM(STR(d2))+' дней.') ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2009, 22:44 |
|
Количество дней до события
|
|||
---|---|---|---|
#18+
Думаю проще всего так :) d = DATE(YEAR(DATE()),MONTH(DATE()),DAY(DATE()))-DATE(YEAR(DATE()),MONTH(plan_sotr.god_rojd),DAY(plan_sotr.god_rojd)) IF d<0 d = d*(-1) thisform.text21.Value = d ELSE thisform.text21.Value = d ENDIF (PS: только вот незнаю как теперь фильтр поставить, таблица называется sotrydnik, имя поля god_rojd. Мне нада только те записи, у которых количество дней до дня рождения не превышает 30. Set filter похоже тут непрокатит, может это всо запихнуть в курсор? Помогите :) ) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2009, 23:52 |
|
Количество дней до события
|
|||
---|---|---|---|
#18+
Окончательный вариант оформленный в виде функции SET TALK OFF SET DATE GERMAN SET CENTURY on CLEAR mydata1={^1972.05.17} mydata2=DATE() mydata3={^2009.12.31} mydata4={^2010.01.01} * первый параметр функции dodobday - день рождения * второй необязательный, по умолчанию равен DATE() * ? dodobday() ? DATE(), ' - ', mydata1, dodobday(mydata1) ? ? mydata2, ' - ', mydata1, dodobday(mydata1,mydata2) ? ? {^2009.05.16}, ' - ', mydata1, dodobday(mydata1,{^2009.05.16}) ? ? {^2009.05.17}, ' - ', mydata1, dodobday(mydata1,{^2009.05.17}) ? ? {^2009.05.18}, ' - ', mydata1, dodobday(mydata1,{^2009.05.18}) ? ? mydata3, ' - ', mydata1, dodobday(mydata1,mydata3) ? ? mydata4, ' - ', mydata1, dodobday(mydata1,mydata4) FUNCTION dodobday PARAMETERS d1,d2 PRIVATE d3,d4 IF parameters()<1 MESSAGEBOX('Задайте параметры функции dodobday:'+CHR(10)+CHR(13)+'d1, d2 - две даты') RETURN .f. ENDIF IF parameters()=1 d2=DATE() IF VARTYPE(d1) # 'D' MESSAGEBOX('Задайте параметры функции dodobday:'+CHR(10)+CHR(13)+'d1 - дата') RETURN .f. ENDIF ENDIF IF parameters()=2 IF VARTYPE(d1) # 'D' AND VARTYPE(d2) # 'D' MESSAGEBOX('Задайте параметры функции dodobday:'+CHR(10)+CHR(13)+'d1, d2 - две даты') RETURN .f. ENDIF ENDIF 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 ENDFUNC ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2009, 01:08 |
|
Количество дней до события
|
|||
---|---|---|---|
#18+
Disaer Так как ты написал нереботает нехера!!! Так сгодится только если у тебя год рождения и текущий год одинаковы. А когда у тебя разница в 20 лет будет, ты никогда число <30 неполучишь. иди проверь если невериш. разница между датами 2009 года и 1988 года примерно равны 7000 дням. А можно печатным языком, или эмоции захлестывают ? ? {^2009-01-01}-{^1988-01-01} возвращает 7671. Под VFP9+SP2. Под WinXP+SP3. У вас не так ? Можно внятно обьяснить, что не устраивает ? "Что ясно представляется, то ясно излагается" (C) Не помню кто. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2009, 01:33 |
|
Количество дней до события
|
|||
---|---|---|---|
#18+
rewareDisaer Так как ты написал нереботает нехера!!! Так сгодится только если у тебя год рождения и текущий год одинаковы. А когда у тебя разница в 20 лет будет, ты никогда число <30 неполучишь. иди проверь если невериш. разница между датами 2009 года и 1988 года примерно равны 7000 дням. А можно печатным языком, или эмоции захлестывают ? ? {^2009-01-01}-{^1988-01-01} возвращает 7671. Под VFP9+SP2. Под WinXP+SP3. У вас не так ? Можно внятно обьяснить, что не устраивает ? "Что ясно представляется, то ясно излагается" (C) Не помню кто. Читаем первое сообщение. Там явно сказано что нужно отбирать людей у которых до дня рождения осталось 30 или менее дней. Теперь читаем читаем твой текст: "{^2009-01-01}-{^1988-01-01} возвращает 7671 дней . Помоему 30 и 7671 день сильно отличаются :) 7671 получается из за тго, что ФокПро щитают разницу между датами в днях! Поэтому чтобы выводилась разница в днях, нужно в переменную занести дату рождения человека, предварительно заменив год на текущий. Теперь вам понятно? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2009, 01:50 |
|
Количество дней до события
|
|||
---|---|---|---|
#18+
Disaer Читаем первое сообщение. Там явно сказано что нужно отбирать людей у которых до дня рождения осталось 30 или менее дней. Теперь читаем читаем твой текст: "{^2009-01-01}-{^1988-01-01} возвращает 7671 дней . Помоему 30 и 7671 день сильно отличаются :) 7671 получается из за тго, что ФокПро щитают разницу между датами в днях! Поэтому чтобы выводилась разница в днях, нужно в переменную занести дату рождения человека, предварительно заменив год на текущий. Теперь вам понятно? Да мне давно все понятно. Надеюсь, и вам после столь долгих и глубоких рассуждений стало понятно, что проблема не в том, чтобы отфильтровать по количеству оставшихся дней, а в решении огромной технической проблемы - подстановки нужного (текущего) года в дату рождения. Или тред еще на двести мессаг разовьется ? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2009, 08:36 |
|
Количество дней до события
|
|||
---|---|---|---|
#18+
Лучше помогите теперь выбрать данные из таблицы, либо в новую таблицу, либо в курсор, где сотруднику осталось 30 или менее дней до ДР. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2009, 10:18 |
|
Количество дней до события
|
|||
---|---|---|---|
#18+
DisaerЛучше помогите теперь выбрать данные из таблицы, либо в новую таблицу, либо в курсор, где сотруднику осталось 30 или менее дней до ДР. Чего ради страждущего не сделаешь :) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2009, 20:59 |
|
Количество дней до события
|
|||
---|---|---|---|
#18+
DisaerGoshaS http://www.sql.ru/forum/actualthread.aspx?tid=649550 Ненашол там именно для моего случая примера. Я ту тему два раза читал до того как создал свою. Там промежутки и тд и тп. А мне надо конкретное количество дней до дня рождения. Я недогнал как сделать через промежутки. Читаем постановку задачи по приведенной ссылке Из справочника персонала выбрать всех людей, у которых день рождения на этой неделе, вне зависимости от года Или выражаясь вашими словами должен установиться фильтр отображающий людей у которых до дня рождения осталось менее 7 дней. Читаем вашу постановку задачи должен установиться фильтр отображающий людей у которых до дня рождения осталось менее 30 дней. Т.е. отличие вашей задачи от той, что по ссылке всего лишь в том, что вам надо указать интервал не в 7 дней, а в 30. Решение там приведено. Надо всего-лишь заменить число 7 на число 30. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2009, 22:09 |
|
Количество дней до события
|
|||
---|---|---|---|
#18+
С некоторыми изменениями для подстраховки от високосного года : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2009, 10:32 |
|
Количество дней до события
|
|||
---|---|---|---|
#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?all=1&fid=41&tid=1586498]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
35ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 11ms |
total: | 142ms |
0 / 0 |