:: Visual Foxpro, Foxpro for DOS
Номер недели по дате
Vedmak

Сообщений: 5949
Откуда: CiTY
Дата регистрации: 30.10.2003
Как программно получить номер недели по дате ?

Не перебором же всех понедельников с начала года ?
Ratings: 0 negative/0 positive
Re: Номер недели по дате
PrSymbol

Сообщений: 682
Откуда: Москва
Дата регистрации: 01.06.2004
WEEK()


------------------
You will not be able to open password-protected files, even if you know the password. (c) MS 2007
Ratings: 0 negative/0 positive
Re: Номер недели по дате
sphinx

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
> программно получить номер недели по дате

Смотря от чего считать номер недели... Если от начала года, то CEILING((DATE() - {^2007-01-01})/7)


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Номер недели по дате
Vedmak

Сообщений: 5949
Откуда: CiTY
Дата регистрации: 30.10.2003
блиииин :-[ я же знал !
Ratings: 0 negative/0 positive
Re: Номер недели по дате
piva

Сообщений: 18655
Откуда: Курган
Дата регистрации: 24.03.2004
Вот еще один - хелп перед сном не читает


------------------
Часто бывает так, что есть над чем задуматься, а нечем.
Ratings: 0 negative/0 positive
Re: Номер недели по дате
iren

Сообщений: 511
Дата регистрации: 28.10.2003
Если от начала года, то использую такую функцию:
LOCAL m.lnNomG,m.lnKolDn,m.lnNomN
m.lnNomG=YEAR(DatServ) && Определяем год
m.lnKolDn=DatServ-CTOD('01.01.'+STR(m.lnNomG,4))+1 && Кол-во дней с нач.года
m.lnNomN=CEILING(m.lnKolDn/7)
m.lcDirNomn=PADL(m.lnNomN,2,'0')+STR(m.lnNomG,4)
RETURN (m.lcDirNomn)


DatServ- дата, получаемая с сервера (или DATE())
Ratings: 0 negative/0 positive
Re: Номер недели по дате
iren

Сообщений: 511
Дата регистрации: 28.10.2003
Забыла уточнить: т.к. мне нужно получать в виде: NNGGGG (NN - N недели с нач.года,GGGG - год), поэтому вычисляю m.lcdirNomn
Ratings: 0 negative/0 positive
Re: Номер недели по дате
PrSymbol

Сообщений: 682
Откуда: Москва
Дата регистрации: 01.06.2004
а все же зачем используете CEILING ?
какой то потаенный смысл ?


------------------
You will not be able to open password-protected files, even if you know the password. (c) MS 2007
Ratings: 0 negative/0 positive
Re: Номер недели по дате
Владимир Максимов

Сообщений: 14095
Откуда: Москва
Дата регистрации: 02.09.2000
PrSymbol
а все же зачем используете CEILING ?
какой то потаенный смысл ?

С начала года прошел 1 день (1 января) делим на 7, получаем 0,14 - это какая неделя? Нулевая? Или все-таки первая?
Ratings: 0 negative/0 positive
Re: Номер недели по дате
PrSymbol

Сообщений: 682
Откуда: Москва
Дата регистрации: 01.06.2004
Не-а я не про саму функцию CEILING
а почему не WEEK({01.01.07}, nFirstWeek , nFirstDayOfWeek)


------------------
You will not be able to open password-protected files, even if you know the password. (c) MS 2007
Ratings: 0 negative/0 positive
Re: Номер недели по дате
Вячеслав Клепинин

Сообщений: 1597
Откуда: Санкт-Петербург
Дата регистрации: 26.03.2004
WEEK лучше всего. Там настройки есть. А то ведь неделя у некоторых не только с понедельника начинается. Ну и ещё бывает, что начинается неделя в одном году, а продолжается в другом. Вот ведь как бывает! А учитывать такие ньюансы иногда очень важно.
Ratings: 0 negative/0 positive
Re: Номер недели по дате
Vedmak

Сообщений: 5949
Откуда: CiTY
Дата регистрации: 30.10.2003
Интересно. Но номер недели возвращаемый функцией WEEK() для 31.12.2007 равен 1.

Этоже не правильно.
Ratings: 0 negative/0 positive
Re: Номер недели по дате
Владимир Максимов

Сообщений: 14095
Откуда: Москва
Дата регистрации: 02.09.2000
VedmakRiga
Интересно. Но номер недели возвращаемый функцией WEEK() для 31.12.2007 равен 1.
Этоже не правильно.

Почему неправильно? 30.12.2007 - это воскресенье. Последний день недели. Следующая неделя, в основном, находится в 2008 году и имеет порядковый номер 1. Логично, что первый день этой недели, также относится к этой неделе.

Об этом написано в комментарии по этой команде Функция WEEK( )

Week
Функция WEEK( ) возвращает число из диапазона от 1 до 53, представляющее номер недели в году. Например, для первой недели года WEEK( ) возвратит 1, для второй недели - 2 и т.д. Следует отметить, что неделя может быть разбита на части, относящиеся к разным годам; первая неделя года, например, может начаться в предыдущем году, а закончиться в текущем.

Вообще-то, все крутится вокруг того, что именно подразумевать под термином "неделя". Толкований может быть много. Если под этим понимается просто 7 дней безотносительно того, когда отсчитывать начало и конец, то зачем нужна функция Week()? Просто поделите на 7 и возьмите ближайшее большее целое число.
Ratings: 0 negative/0 positive
Re: Номер недели по дате
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
VedmakRiga
Интересно. Но номер недели возвращаемый функцией WEEK() для 31.12.2007 равен 1.
Этоже не правильно.

Действительно, как уже и заметили - недели бывают разные.

? WEEK(CTOD('31.12.2007'),1) && если неделя обязательно должна содержать 1 января
1
? WEEK(CTOD('31.12.2007'),2) && если неделя должна содержать 4 дня после 1 января
1
? WEEK(CTOD('31.12.2007'),3) && если неделя должна быть первой полной неделей после 1 января
52

Так что по сути вроде все верно.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: Номер недели по дате
Vedmak

Сообщений: 5949
Откуда: CiTY
Дата регистрации: 30.10.2003
как все непросто на этом свете...
Ratings: 0 negative/0 positive
Re: Номер недели по дате
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
Все проблемы - только из-за того, что 1 января не всегда начинается новая неделя. Поэтому и столько условностей - что считать первой неделей, и должно ли входить туда 31 декабря.
Если бы 1 января каждый год было понедельником, все было бы намного проще.
Однажды где-то читал кстати про такой проект календаря. Французские математики что ли придумали. Все месяцы предлагали сделать одинаковыми - по 30 дней. А между сезонами внемесячные праздники - день весны, день лета и т.д. Потом под новый год добавить еще один внемесячный праздник - день года, а для високосных добавлять еще один - день мира. Тогда каждый день года всегда бы приходился на один и тот же день недели.
Этот проект вроде даже выдвигали куда-то в международные организации, но там зарубили на корню, потому как слишком нарушались бы традиции.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: Номер недели по дате
GreyCat
Автор

Сообщений: 12
Дата регистрации: 06.07.2010
Цитата:
ГОСТ ИСО 8601-2001 «ПРЕДСТАВЛЕНИЕ ДАТ И ВРЕМЕНИ» — официальный способ расчета номера недели в Российской Федерации. По поводу порядкового номера недели считается, что первой неделей года является та неделя, на которую попадает первый четверг нового года, или, что эквивалентно, та неделя, которая содержит число 4 января. То есть, если первое января выпадает на пятницу, субботу, или воскресенье, то все еще продолжается последняя неделя предыдущего года. Это может приводить к интересным спецэффектам — в году может содержаться 52 или 53 недели, 29, 30, 31 декабря могут относиться к первой неделе следующего года, и наоборот, 1, 2, и 3 января могут относиться к 52 или 53 неделе прошлого года.
Так, так так. Выбираю в соответствии с этим в функции Week() параметр 2 (Первой считается неделя, большая часть которой (четыре дня) приходится на текущий год.), как наиболее подходящий. Проверяю, благо далеко ходить не надо. 1 января 2017 приходится на воскресенье и неделя должна относится к предыдущему году.
Week({^2017-1-1},2) Выдает 1, а должно 52. SET FWEEK TO - эффекта не дает. Это только у меня или у всех такое?
Ratings: 0 negative/0 positive
Re: Номер недели по дате
AndyNigmatec

Сообщений: 1552
Откуда: Волгоград
Дата регистрации: 28.06.2015
я себе процедурку помню на эту тему набросал ... не в фоксе - но сути не меняет

ооо, раскопал ... почти раритет ужо )))




Исправлено 1 раз(а). Последнее : AndyNigmatec, 16.03.18 15:37
Ratings: 0 negative/1 positive
Re: Номер недели по дате
Sawradym

Сообщений: 2244
Откуда: Винница
Дата регистрации: 15.05.2007
GreyCat
Цитата:
ГОСТ ИСО 8601-2001 «ПРЕДСТАВЛЕНИЕ ДАТ И ВРЕМЕНИ» — официальный способ расчета номера недели в Российской Федерации. По поводу порядкового номера недели считается, что первой неделей года является та неделя, на которую попадает первый четверг нового года, или, что эквивалентно, та неделя, которая содержит число 4 января. То есть, если первое января выпадает на пятницу, субботу, или воскресенье, то все еще продолжается последняя неделя предыдущего года. Это может приводить к интересным спецэффектам — в году может содержаться 52 или 53 недели, 29, 30, 31 декабря могут относиться к первой неделе следующего года, и наоборот, 1, 2, и 3 января могут относиться к 52 или 53 неделе прошлого года.
Так, так так. Выбираю в соответствии с этим в функции Week() параметр 2 (Первой считается неделя, большая часть которой (четыре дня) приходится на текущий год.), как наиболее подходящий. Проверяю, благо далеко ходить не надо. 1 января 2017 приходится на воскресенье и неделя должна относится к предыдущему году.
Week({^2017-1-1},2) Выдает 1, а должно 52. SET FWEEK TO - эффекта не дает. Это только у меня или у всех такое?

Так не у всех же неделя с понедельника начинается. Смотрите третий параметр.


------------------
Ratings: 0 negative/1 positive
Re: Номер недели по дате
GreyCat
Автор

Сообщений: 12
Дата регистрации: 06.07.2010
Sawradym
Так не у всех же неделя с понедельника начинается. Смотрите третий параметр.
Большое спасибо. Вот называется заклинило на одном. Про последний параметр забыл. А ведь в хелпы лазил. Выручили. А то я тут уже взялся писать собственную функцию.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 25 alex;  (Гостей: 24)

© 2000-2024 Fox Club 
Яндекс.Метрика