powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Количество дней до события
32 сообщений из 32, показаны все 2 страниц
Количество дней до события
    #35963958
Disaer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здраствуйте, есть в таблице поле (god_rojd) типа date хранящее дату рождения. Мне нужно узнать разницу в днях между текущей датой и датой рождения, разницу выводить в TextBox.
Все это нужно для установки фильтра, на форме есть кнопка "Показать именинников", при нажатии на кнопку должен установиться фильтр отображающий людей у которых до дня рождения осталось менее 30 дней.
Формат даты: SET DATE GERMAN
...
Рейтинг: 0 / 0
Количество дней до события
    #35963967
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Количество дней до события
    #35963969
GoshaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где то недавно это обсуждалось :-) На страницы так 2-е, 3-и.
...
Рейтинг: 0 / 0
Количество дней до события
    #35963970
AK-Shah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
thisform.txtDateRojd.Value = DATE()-date_rojd
...
Рейтинг: 0 / 0
Количество дней до события
    #35963975
GoshaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.sql.ru/forum/actualthread.aspx?tid=649550
...
Рейтинг: 0 / 0
Количество дней до события
    #35964028
Disaer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AK-Shah,
твой спосо не канает, потому что тут учитывается год разница между 1988 и 2008 годом составит примерно 7000 дней. в итоге я никогда неполучу при таком способе, что до дня рождения человеку осталось 30 дней.
...
Рейтинг: 0 / 0
Количество дней до события
    #35964059
Disaer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
...
Рейтинг: 0 / 0
Количество дней до события
    #35964065
Disaer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Количество дней до события
    #35964222
guest12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
set date german
set century on

? ? INT(((YEAR(DATE())-YEAR({^1972.05.17}))*365.25)-(DATE() - {^1972.05.17}))

Ps. до моего дня рождения осталось ....
...
Рейтинг: 0 / 0
Количество дней до события
    #35964237
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DisaerЗдраствуйте, есть в таблице поле (god_rojd) типа date хранящее дату рождения. Мне нужно узнать разницу в днях между текущей датой и датой рождения, разницу выводить в TextBox.
Все это нужно для установки фильтра, на форме есть кнопка "Показать именинников", при нажатии на кнопку должен установиться фильтр отображающий людей у которых до дня рождения осталось менее 30 дней.
Формат даты: SET DATE GERMAN

Это круто.

TextBox.value=date()-god_rojd
SET FILTER TO date()-god_rojd<30

Или надо с десяток ссылок в инете ?
...
Рейтинг: 0 / 0
Количество дней до события
    #35964240
Disaer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Guest12345set date german
set century on

? ? INT(((YEAR(DATE())-YEAR({^1972.05.17}))*365.25)-(DATE() - {^1972.05.17}))

Ps. до моего дня рождения осталось ....

Спасибо очень помогло. Только у меня тут пришлось поменять фигурные скобки на круглые.
...
Рейтинг: 0 / 0
Количество дней до события
    #35964242
Disaer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 дням.
...
Рейтинг: 0 / 0
Количество дней до события
    #35964248
guest12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Disaer[quot Guest12345]set date german
set century on

? INT(((YEAR(DATE())-YEAR({^1972.05.17}))*365.25)-(DATE() - {^1972.05.17}))

Ps. до моего дня рождения осталось ....

Спасибо очень помогло. Только у меня тут пришлось поменять фигурные скобки на круглые.[/quot

Только надо смотреть если результат положительный, то до текущего события осталось
столько дней сколько получается, а если отрицательный, значит событие уже прошло,
и не совсем наверно правильно показывает, ну мысль наверно можно поправить
в нужном направлении
...
Рейтинг: 0 / 0
Количество дней до события
    #35964256
Disaer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
...
Рейтинг: 0 / 0
Количество дней до события
    #35964263
guest12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Количество дней до события
    #35964266
guest12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю так правильно будет

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))+' дней.')
...
Рейтинг: 0 / 0
Количество дней до события
    #35964292
Disaer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Думаю проще всего так :)

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 похоже тут непрокатит, может это всо запихнуть в курсор? Помогите :) )
...
Рейтинг: 0 / 0
Количество дней до события
    #35964319
guest12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Окончательный вариант оформленный в виде функции

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
...
Рейтинг: 0 / 0
Количество дней до события
    #35964321
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Disaer
Так как ты написал нереботает нехера!!! Так сгодится только если у тебя год рождения и текущий год одинаковы. А когда у тебя разница в 20 лет будет, ты никогда число <30 неполучишь. иди проверь если невериш. разница между датами 2009 года и 1988 года примерно равны 7000 дням.

А можно печатным языком, или эмоции захлестывают ?

? {^2009-01-01}-{^1988-01-01} возвращает 7671. Под VFP9+SP2. Под WinXP+SP3. У вас не так ? Можно внятно обьяснить, что не устраивает ? "Что ясно представляется, то ясно излагается" (C) Не помню кто.
...
Рейтинг: 0 / 0
Количество дней до события
    #35964323
Disaer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 получается из за тго, что ФокПро щитают разницу между датами в днях! Поэтому чтобы выводилась разница в днях, нужно в переменную занести дату рождения человека, предварительно заменив год на текущий.
Теперь вам понятно?
...
Рейтинг: 0 / 0
Количество дней до события
    #35964369
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Disaer
Читаем первое сообщение. Там явно сказано что нужно отбирать людей у которых до дня рождения осталось 30 или менее дней.
Теперь читаем читаем твой текст: "{^2009-01-01}-{^1988-01-01} возвращает 7671 дней . Помоему 30 и 7671 день сильно отличаются :) 7671 получается из за тго, что ФокПро щитают разницу между датами в днях! Поэтому чтобы выводилась разница в днях, нужно в переменную занести дату рождения человека, предварительно заменив год на текущий.
Теперь вам понятно?

Да мне давно все понятно. Надеюсь, и вам после столь долгих и глубоких рассуждений стало понятно, что проблема не в том, чтобы отфильтровать по количеству оставшихся дней, а в решении огромной технической проблемы - подстановки нужного (текущего) года в дату рождения. Или тред еще на двести мессаг разовьется ?
...
Рейтинг: 0 / 0
Количество дней до события
    #35964396
Disaer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лучше помогите теперь выбрать данные из таблицы, либо в новую таблицу, либо в курсор, где сотруднику осталось 30 или менее дней до ДР.
...
Рейтинг: 0 / 0
Количество дней до события
    #35964781
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DisaerЛучше помогите теперь выбрать данные из таблицы, либо в новую таблицу, либо в курсор, где сотруднику осталось 30 или менее дней до ДР.

Чего ради страждущего не сделаешь :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE CURSOR drs (fio c( 20 ), dr d)
INSERT INTO drs (fio, dr) VALUES ('Петров', {^ 1990 . 01 . 21 })
INSERT INTO drs (fio, dr) VALUES ('Иванов', {^ 1990 . 05 . 21 })
INSERT INTO drs (fio, dr) VALUES ('Сидоров', {^ 1990 . 06 . 21 })
INSERT INTO drs (fio, dr) VALUES ('Павлов', {^ 1990 . 07 . 21 })

SELECT fio, dr, DAY(drs.dr) as p1, MONTH(drs.dr) as p2 FROM drs ;
	WHERE DATE(YEAR(DATE()), MONTH(drs.dr), DAY(drs.dr))-DATE()< 30  AND ;
	DATE(YEAR(DATE()), MONTH(drs.dr), DAY(drs.dr))-DATE()> 0  AND ;
	NOT EMPTY(DATE(YEAR(DATE()), MONTH(drs.dr), DAY(drs.dr))-DATE()) ;
	INTO CURSOR drs2

BROWSE FIELDS fio, dr
CLOSE DATABASES
RETURN
...
Рейтинг: 0 / 0
Количество дней до события
    #35964824
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DisaerGoshaS http://www.sql.ru/forum/actualthread.aspx?tid=649550
Ненашол там именно для моего случая примера. Я ту тему два раза читал до того как создал свою.
Там промежутки и тд и тп. А мне надо конкретное количество дней до дня рождения. Я недогнал как сделать через промежутки.

Читаем постановку задачи по приведенной ссылке

Из справочника персонала выбрать всех людей, у которых день рождения на этой неделе, вне зависимости от года
Или выражаясь вашими словами

должен установиться фильтр отображающий людей у которых до дня рождения осталось менее 7 дней.
Читаем вашу постановку задачи

должен установиться фильтр отображающий людей у которых до дня рождения осталось менее 30 дней.
Т.е. отличие вашей задачи от той, что по ссылке всего лишь в том, что вам надо указать интервал не в 7 дней, а в 30. Решение там приведено. Надо всего-лишь заменить число 7 на число 30.
...
Рейтинг: 0 / 0
Количество дней до события
    #35965018
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С некоторыми изменениями для подстраховки от високосного года :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE CURSOR drs (fio c( 20 ), dr d)
INSERT INTO drs (fio, dr) VALUES ('Петров', {^ 1990 . 01 . 21 })
INSERT INTO drs (fio, dr) VALUES ('Сидоров', {^ 1990 . 05 . 21 })
INSERT INTO drs (fio, dr) VALUES ('Семенов', {^ 1990 . 06 . 21 })
INSERT INTO drs (fio, dr) VALUES ('Павлов', {^ 1990 . 07 . 21 })

wh="iif(NOT EMPTY(DATE(YEAR(DATE()), MONTH(drs.dr), DAY(drs.dr))),"+ ;
	"DATE(YEAR(DATE()), MONTH(drs.dr), DAY(drs.dr))-DATE()<30,"+ ;
	"DATE(YEAR(DATE()), 2, 28)-DATE()<30) AND "+ ;
	"iif(NOT EMPTY(DATE(YEAR(DATE()), MONTH(drs.dr), DAY(drs.dr))),"+ ;
	"DATE(YEAR(DATE()), MONTH(drs.dr), DAY(drs.dr))-DATE()>0,"+ ;
	"DATE(YEAR(DATE()), 2, 28)-DATE()>0)"
	
SELECT fio, dr FROM drs ;
	WHERE &wh ;
	INTO CURSOR drs2
IF _TALLY= 1 
	=MESSAGEBOX('Опять Сидорова поздравлять...')
ENDIF 
BROWSE FIELDS fio, dr
CLOSE DATABASES
RETURN
...
Рейтинг: 0 / 0
Количество дней до события
    #35965118
alextashk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
? (date(2009, 5, 31)-date()) %365 < 30 && да
? (date(1987, 5, 31)-date()) %365 < 30 && да
? (date(1900, 7, 31)-date()) %365 < 30 && нет
...
Рейтинг: 0 / 0
Количество дней до события
    #35965277
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
? (date( 1987 ,  6 ,  6 )-date()) %  365  <  30  && да

Ничего себе! 6 июня отстоит от 2 мая меньше, чем на 30 дней!

К сожалению, использовать в качестве основания вместо 365 значение 365,25 не получится, поскольку в этом случае сложно сказать, каков будет результат округления для интервалов, меньше 4 лет. Поэтом, логично просто рассчитать количество лет (по 365 дней) и поделив это значение на 4 внести поправку.

Код: plaintext
? (date( 1987 ,  6 ,  6 )-date()) %  365  - floor((date( 1987 ,  6 ,  6 )-date()) /  365  /  4 )  <  30  && нет (разница  35  дней)

Почему надо брать ближайшее большее (для отрицательных чисел ближайшее меньшее)? Ну, потому, что если интервал между датами, составляет, например, 5 лет, то в него попало 2 високосных года, а не 1, как получится если взять просто целую часть от деления 5/4.

Если интервал составил ровно 4 года, то в него попал только один високосный год, поскольку считаем "года" состоящие из 365 дней.

Разумеется, этот алгоритм даст ошибку, если интервал дат больше, чем 365 лет. Но, не думаю, что в этом случае кто-то будет определять дату рождения.

В общем, решение простое только на первый взгляд. Если доводить его до завершения, то оно становится не такое уж и простое и далеко не очевидное.
...
Рейтинг: 0 / 0
Количество дней до события
    #35965575
guest12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В данном случае - без разницы. Все равно ведь попали, но если взять даты

? (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

и поскольку используется стандартная операция вычитания из большей даты
меньшую, то и считает все правильно, в том числе и с високосными годами
все в порядке
...
Рейтинг: 0 / 0
Количество дней до события
    #35965932
alextashk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ,

Да Вы правы, поэтому, с учётом требования найти людей с датами дней рождений, отстоящими от текущей даты, на менее 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 && нет
...
Рейтинг: 0 / 0
Количество дней до события
    #35965978
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята, я понимаю, "в лом" читать все то, что уже было понаписано на эту тему. Но ведь вы буквально шаг-в-шаг наступаете на все те же грабли, про которые уже было сказано не однократно.

Проблема в формировании значения даты из "слагаемых" заключается в том, что далеко не факт, что в результате получится корректное выражение даты. Возможна ошибка с разными последствиями.

Для примера

Код: plaintext
1.
2.
3.
SET DATE GERMAN
?CTOD("29.02.2001")  && получим пустую дату, поскольку  2001  год не високосный
?Date( 2001 , 2 , 29 )   && получим пустую дату, поскольку  2001  год не високосный

Кроме того, если подставлять в дату значения текущего года, то напарываемся на проблему перехода через год. Это когда день рождения, скажем 31 декабря, а сегодня 1 января. Имеем

Код: plaintext
?(Date( 2009 , 12 , 31 )-Date( 2009 , 1 , 1 )) %  365   &&  364  дня разницы!

Ну, пожалуйста, прежде, чем опять что-то писать, ПРОЧИТАЙТЕ то, что уже обсуждалось до вас. Ведь все это уже БЫЛО.
...
Рейтинг: 0 / 0
Количество дней до события
    #35966439
той
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМРебята, я понимаю, "в лом" читать все то, что уже было понаписано на эту тему. Но ведь вы буквально шаг-в-шаг наступаете на все те же грабли, про которые уже было сказано не однократно.

Проблема в формировании значения даты из "слагаемых" заключается в том, что далеко не факт, что в результате получится корректное выражение даты. Возможна ошибка с разными последствиями.

Для примера

Код: plaintext
1.
2.
3.
SET DATE GERMAN
?CTOD("29.02.2001")  && получим пустую дату, поскольку  2001  год не високосный
?Date( 2001 , 2 , 29 )   && получим пустую дату, поскольку  2001  год не високосный

Кроме того, если подставлять в дату значения текущего года, то напарываемся на проблему перехода через год. Это когда день рождения, скажем 31 декабря, а сегодня 1 января. Имеем

Код: plaintext
?(Date( 2009 , 12 , 31 )-Date( 2009 , 1 , 1 )) %  365   &&  364  дня разницы!

Ну, пожалуйста, прежде, чем опять что-то писать, ПРОЧИТАЙТЕ то, что уже обсуждалось до вас. Ведь все это уже БЫЛО.

С датой 29 февраля действительно проблема, но второй указанный случай, в котором вы противоречите себе, т.к. если дата рождения 31 декабря, а сегодня 1 января, то это
значит что родился он как минимум в прошлом году, а не в текущем, и до его дня рождения
364 дня, все правильно.
...
Рейтинг: 0 / 0
Количество дней до события
    #35966593
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
той
С датой 29 февраля действительно проблема, но второй указанный случай, в котором вы противоречите себе, т.к. если дата рождения 31 декабря, а сегодня 1 января, то это
значит что родился он как минимум в прошлом году, а не в текущем, и до его дня рождения
364 дня, все правильно.
Действительно, забыл, что рассматривается "будущая" дата. Т.е. определяется не просто "интервал", а "направленный интервал". В этом случае, при расчете остатка от деления на 365 проблемы "перехода через год" нет. Но остается проблема високосных лет.
...
Рейтинг: 0 / 0
32 сообщений из 32, показаны все 2 страниц
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Количество дней до события
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]