powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / выборка по дате
25 сообщений из 43, страница 1 из 2
выборка по дате
    #35886516
Bolik2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
имеется :
datebegin={01/01/2009}
dateend=date()+10

как выбрать все данные из таблицы шо попадают в диапазон между datebegin i dateend по дню и месяцу, тоесть если есть b_d="23/03/1982" - попадает, если b_d="23/05/2001" то не попадает?
...
Рейтинг: 0 / 0
выборка по дате
    #35886539
Bolik2kимеется :
datebegin={01/01/2009}
dateend=date()+10

как выбрать все данные из таблицы шо попадают в диапазон между datebegin i dateend по дню и месяцу, тоесть если есть b_d="23/03/1982" - попадает, если b_d="23/05/2001" то не попадает?И что же делать с годом?
...
Рейтинг: 0 / 0
выборка по дате
    #35886561
Bolik2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проходящий.,

не учитывать
...
Рейтинг: 0 / 0
выборка по дате
    #35886588
Bolik2kимеется :
datebegin={01/01/2009}
dateend=date()+10

как выбрать все данные из таблицы шо попадают в диапазон между datebegin i dateend по дню и месяцу, тоесть если есть b_d="23/03/1982" - попадает, если b_d="23/05/2001" то не попадает?
Хм, dateend при указанных условиях будет {10/01/2009}. Каким образом 23/03/1982 должна попадать в диапазон между 1 и 10 днями и 1 месяцем? Или я неправильно понял?
...
Рейтинг: 0 / 0
выборка по дате
    #35886604
Dag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то типа конструкции

SUBSTR(DTOS(b_d),5)
...
Рейтинг: 0 / 0
выборка по дате
    #35886635
DagЧто-то типа конструкции

SUBSTR(DTOS(b_d),5)Ну да, для работы с датой можно использовать только функции работы со строками? Работатть с датой без конвертации ее в строку работать невозможно? Функции работы с датами тут идут по боку?
...
Рейтинг: 0 / 0
выборка по дате
    #35886665
Dag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь нет работы с датами. Если исключить год из даты - то по-любому получится нечто промежуточное - числовое или строковое значение.
"Я так думаю!" (с)
...
Рейтинг: 0 / 0
выборка по дате
    #35886702
DagЗдесь нет работы с датами. Если исключить год из даты - то по-любому получится нечто промежуточное - числовое или строковое значение.
"Я так думаю!" (с)И даже если получится числовое, то все равно надо применять только строковые функции?
...
Рейтинг: 0 / 0
выборка по дате
    #35886730
Dag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проходящийИ даже если получится числовое, то все равно надо применять только строковые функции?

Темна вода в облацех.

Для решения предложенной задачи, мне кажется, вполне подойдет between в комбинации с со строковыми величинами. Если у Вас есть другое решение - я ни в коем случае не против. Предложите топикстартеру.
...
Рейтинг: 0 / 0
выборка по дате
    #35886795
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DagпроходящийИ даже если получится числовое, то все равно надо применять только строковые функции?

Темна вода в облацех.

Для решения предложенной задачи, мне кажется, вполне подойдет between в комбинации с со строковыми величинами. Если у Вас есть другое решение - я ни в коем случае не против. Предложите топикстартеру.Between подойдет и с числовыми величинами. И такой вариант есть. И в случае его соответствия задаче предложу.
И все равно страсть именно к строковым функциям во всех случаях жизни мной так и непонята.
...
Рейтинг: 0 / 0
выборка по дате
    #35886837
Dag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey Sizov. И все равно страсть именно к строковым функциям во всех случаях жизни мной так и непонята.

Могу только восхититься подобным талантом. Увидеть в коротенькой веточке - страсть именно к строковым функциям во ВСЕХ случаях жизни - это, без лести, искусство.

"В капле воды он мог разглядеть океан" (с)

Спасибо доктор, каждый раз используя строковые функции - буду фиксировать на этом внимание и может даже встану на путь исправления и сотрудничества с администрацией. ;-)
...
Рейтинг: 0 / 0
выборка по дате
    #35886849
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм, если стоит примерно следующая задача

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

то я как-то не вижу решения лучше, чем перевод даты в строковое представление с последующим отрезанием года. Ну, да, можно извратиться с выделением месяца и дня, но, как мне кажется, это будет более громоздкое решение, чем предложение Dag . Знаете решение лучше? Покажите как?
...
Рейтинг: 0 / 0
выборка по дате
    #35886890
ВладимирМ,
day(date()) и month(date()) сложнее строковых функций? И тут надо вычислять позиции нужных элементов? Есть зависимость от строкового формата даты?
...
Рейтинг: 0 / 0
выборка по дате
    #35887052
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проходящий.ВладимирМ,
day(date()) и month(date()) сложнее строковых функций? И тут надо вычислять позиции нужных элементов? Есть зависимость от строкового формата даты?

Да можно и без перехода к строкам.

Condition=day(DateField)>=day(Date1) .and. day(DateField)<=day(Date2) .and. ;
month(DateField)>=month(Date1) .and. month(DateField)<=month(Date2)

Вне зависимости от года (хотя можно и его сюда привинтить).
...
Рейтинг: 0 / 0
выборка по дате
    #35887415
Bolik2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМХм, если стоит примерно следующая задача

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

то я как-то не вижу решения лучше, чем перевод даты в строковое представление с последующим отрезанием года. Ну, да, можно извратиться с выделением месяца и дня, но, как мне кажется, это будет более громоздкое решение, чем предложение Dag . Знаете решение лучше? Покажите как?

да, именно такая задача и стоит!
...
Рейтинг: 0 / 0
выборка по дате
    #35887662
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проходящий.ВладимирМ,
day(date()) и month(date()) сложнее строковых функций? И тут надо вычислять позиции нужных элементов? Есть зависимость от строкового формата даты?

Решений всегда несколько. Задача заключается в том, чтобы выбрать оптимальное. В данном случае, наиболее простое для понимания и возможной последующей модификации.

Пример реализации через Day() и Month() привел reware . Повторю его еще раз слегка изменив для наглядности

Код: plaintext
1.
2.
3.
month(DateField)>=month(Date1) and day(DateField)>=day(Date1) ;
and ;
month(DateField)<=month(Date2) and day(DateField)<=day(Date2) 

Теперь запишем то же самое, но используя перевод в строковое представление

Код: plaintext
Right(Dtos(DateField), 4 ) between Right(Dtos(Date1), 4 ) and Right(Dtos(Date2), 4 )

На всякий случай напомню, что преобразование DTOS() возвращает строку вида "ГГГГММДД". Т.е. она никак не зависит от формата даты. При помощи функции Right() просто отрезаем фрагмент строки с месяцем и днем. Причем получаем фрагмент в виде удобном для сравнения на больше/меньше.

Однако данное решение не учитывает возможный переход через год. Это когда Date1 оказывается концом декабря, а Date2 - началом января. Т.е. месяц начала диапазона оказывается меньше, чем месяц конца диапазона.

Собственно, ничего сложного, но если учитывать еще и этот вариант, то условия получаются такие

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
(
month(Date1) <= month(Date2) and ;
	(
	month(DateField)>=month(Date1) and day(DateField)>=day(Date1) ;
	and ;
	month(DateField)<=month(Date2) and day(DateField)<=day(Date2) ;
	) ;
) ;
OR ;
( ;
month(Date1) > month(Date2) and ;
	NOT ( ;
	month(DateField) < month(Date1) and day(DateField) < day(Date1) ;
	and ;
	month(DateField) > month(Date2) and day(DateField) > day(Date2) ;
	) ;
)

Через строковое представление

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
(
month(Date1) <= month(Date2) and ;
	Right(Dtos(DateField), 4 ) between Right(Dtos(Date1), 4 ) and Right(Dtos(Date2), 4 ) ;
) ;
OR ;
( ;
month(Date1) > month(Date2) and ;
	NOT Right(Dtos(DateField), 4 ) between Right(Dtos(Date2+ 1 ), 4 ) and Right(Dtos(Date1- 1 ), 4 ) ;
)

И какой вариант лично вы предпочли бы использовать?
...
Рейтинг: 0 / 0
выборка по дате
    #35887775
Bolik2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ,

большое спасибо ! все получилось. Лично я предпочел вариан без преобразования в строку, вариант с датами
...
Рейтинг: 0 / 0
выборка по дате
    #35887788
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ,
предложу такой вариант:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
datebegin=Date()
dateend=date()+ 10 
?datebegin
?dateend
b_d={^ 1982 - 03 - 26 }
?b_d
?Date(Year(datebegin), Month(b_d), Day(b_d))
?Date(Year(dateend), Month(b_d), Day(b_d))

?Between(Date(Year(datebegin), Month(b_d), Day(b_d)), datebegin, dateend) ;
or Between(Date(Year(dateend), Month(b_d), Day(b_d)), datebegin, dateend)
b_d={^ 2001 - 05 - 26 }
?b_d
?Between(Date(Year(datebegin), Month(b_d), Day(b_d)), datebegin, dateend) ;
or Between(Date(Year(dateend), Month(b_d), Day(b_d)), datebegin, dateend)
...
Рейтинг: 0 / 0
выборка по дате
    #35887855
karly™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМОднако данное решение не учитывает возможный переход через год. Это когда Date1 оказывается концом декабря, а Date2 - началом января. Т.е. месяц начала диапазона оказывается меньше, чем месяц конца диапазона.Если учитывать диапазон дат больше, чем "ближайшие две недели", то возможны предельные случаи:

1. Заданный диапазон дат - больше 11 месяцев.
Date1 = {^2009-01-25}, Date2 = {^2010-01-24}.
Алгоритмы, приведенные выше, при любой дате рождения дадут отрицательный результат

2. Начальная и конечная дата диапазона меньше, чем дата рождения.
Date1 = {^2000-01-01}, Date2 = {^2000-02-01}, DateField = {^2001-01-15}
Нет смысла отмечать ДР до того, как это ДР произошло

3. Начальная дата диапазона больше конечной (пользователь ввел некорректные данные)
Date1 = {^2009-05-05}, Date2 = {^2009-04-04}
...
Рейтинг: 0 / 0
выборка по дате
    #35888420
GoshaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
ldStartDate=DATE()- 7 
ldEndDate=DATE()+ 7 
** dr-поле таблицы с датой рождения
where DATE(YEAR(ldStartDate),MONTH(dr),DAY(dr)) between ldStartDate and ldEndDate OR ; 
      DATE(YEAR( ldEndDate ),MONTH(dr),DAY(dr)) between ldStartDate and ldEndDate  
как такой вариант? В принципе и переходы с года на год предусмотрены
...
Рейтинг: 0 / 0
выборка по дате
    #35888462
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GoshaS
Код: plaintext
1.
2.
3.
4.
5.
ldStartDate=DATE()- 7 
ldEndDate=DATE()+ 7 
** dr-поле таблицы с датой рождения
where DATE(YEAR(ldStartDate),MONTH(dr),DAY(dr)) between ldStartDate and ldEndDate OR ; 
      DATE(YEAR( ldEndDate ),MONTH(dr),DAY(dr)) between ldStartDate and ldEndDate  
как такой вариант? В принципе и переходы с года на год предусмотрены
А от моего варианта сильно отличается? :) Или просто он и взят и по-другому переписан?
...
Рейтинг: 0 / 0
выборка по дате
    #35888499
GoshaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Sergey Sizov
Да практически то-же самое.
Стормозил малёхо
...
Рейтинг: 0 / 0
выборка по дате
    #35889158
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В принципе, можно вычислять не саму дату, с которой пойдет сравнение, а диапазоны. Граничные условия

DateFrom - начальная дата
lnDay - количество дней диапазона, отсчитываемого от начальной даты

Код: plaintext
1.
DateField between Date(Year(DateField), Month(m.DateFrom), Day(m.DateFrom)) and ;
		Date(Year(DateField), Month(m.DateFrom), Day(m.DateFrom)) + m.lnDay

При таком способе совершенно не важно, где окажется конечная дата диапазона. В этом же году или в следующем.

Но у использования Date() есть одно слабое место - високосный год и 29 февраля. Очевидно, что Date(2001,2,29) даст ошибку. Пустую дату.

Самым корректным решением являлось бы наличие отдельной таблицы-календаря. Связь по Inner JOIN с этой таблицей и фильтрация по реквизитам этой таблицы. Но, разумеется, эту таблицу предварительно надо создать и наполнить.
...
Рейтинг: 0 / 0
выборка по дате
    #35889857
Dag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если уж тут проходит конкурс извращенцОв - то могу я представить свою версию?
Типа такого
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
ldStartDate=DATE()- 7 
ldEndDate=DATE()+ 7 

** dr-поле таблицы с датой рождения


where between(YEAR(dr)* 385 +MONTH(dr)* 32 +DAY(dr),;
		  YEAR(ldStartDate)* 385 +MONTH(ldStartDate)* 32 +DAY(ldStartDate),;
		  YEAR(ldEndDate)* 385 +MONTH(ldEndDate)* 32 +DAY(ldEndDate))	  

...
Рейтинг: 0 / 0
выборка по дате
    #35890067
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DagЕсли уж тут проходит конкурс извращенцОв - то могу я представить свою версию?
Типа такого
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
ldStartDate=DATE()- 7 
ldEndDate=DATE()+ 7 

** dr-поле таблицы с датой рождения


where between(YEAR(dr)* 385 +MONTH(dr)* 32 +DAY(dr),;
		  YEAR(ldStartDate)* 385 +MONTH(ldStartDate)* 32 +DAY(ldStartDate),;
		  YEAR(ldEndDate)* 385 +MONTH(ldEndDate)* 32 +DAY(ldEndDate))	  



Мда-а... И чем люди от тоски не занимаются. Вашу бы изобретательность, да в мирных целях :)
...
Рейтинг: 0 / 0
25 сообщений из 43, страница 1 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / выборка по дате
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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