powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / выборка по дате
43 сообщений из 43, показаны все 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
выборка по дате
    #35890176
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DagЕсли уж тут проходит конкурс извращенцОв - то могу я представить свою версию?
Типа такого
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
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))	  


Если убрать все ваши навороты, то, по сути, вы написали такое условие

Код: plaintext
dr between ldStartDate and ldEndDate

Но по условиям задачи сравниваются только месяц и день. Без учета года. А в вашем решении год играет существенную роль. Т.е. поставленную задачу не решает.
...
Рейтинг: 0 / 0
выборка по дате
    #35890900
GoshaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
lsDate=SET("Date")
SET DATE GERMAN
ldStartDate=DATE()
ldEndDate=DATE()+ 7 
if right(dtoc(ldStartDate), 5 )='29.02'
   ldStartDate=ldStartDate- 1 
endif 
if right(dtoc(ldEndDate), 5 )='29.02'
   ldEndDate=ldEndDate+ 1 
endif 
** 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 
SET DATE '&lsDate'
Погрешность в один день ИМХО не критична, будет просто расширен диапазон на один денёк, зато никаких заморочек с високосными годами не будет. Это же не расчет процентов, а предупреждение о д/р ;-)
...
Рейтинг: 0 / 0
выборка по дате
    #35891012
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GoshaS
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
lsDate=SET("Date")
SET DATE GERMAN
ldStartDate=DATE()
ldEndDate=DATE()+ 7 
if right(dtoc(ldStartDate), 5 )='29.02'
   ldStartDate=ldStartDate- 1 
endif 
if right(dtoc(ldEndDate), 5 )='29.02'
   ldEndDate=ldEndDate+ 1 
endif 
** 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 
SET DATE '&lsDate'
Погрешность в один день ИМХО не критична, будет просто расширен диапазон на один денёк, зато никаких заморочек с високосными годами не будет. Это же не расчет процентов, а предупреждение о д/р ;-)
Вы не ту дату сравниваете с 29 февраля.

Ошибку будет давать функция Date(), следовательно, анализировать надо те параметры, которые будут передаваться в эту функцию.

Если dr - это поле таблицы, то разве ваш код исключает возможность этой ошибки в функции Date()? Ведь день месяца и сам месяц берется именно из поля таблицы.

Если вы хотите исключить ошибку високосного года, то в вашем примере надо озаботится тем, чтобы YEAR(ldStartDate) и Year(ldEndDate) возвращали именно високосный год. Например, 2000. А сдвиг на один день ошибку не исключает. Другими словами, год надо задать явно.

Код: plaintext
1.
2.
ldStartDate = DATE( 2000 , MONTH(date()), DAY(date()))
ldEndDate = m.ldStartDate +  7 

Тогда уже не важно, что будет стоять в качестве месяца и дня в функции Date(), поскольку год все-равно високосный. Ошибки быть не может.

Однако при переходе через новый год это все-равно может породить ошибку, поскольку следующий год будет не високосным и опять возможно 29 февраля. Но здесь можно исходить из предполождения, что рассматриваемый период заведомо меньше месяца.

Т.е. если попали на 29 февраля и год не високосный, то функция Date() вернет пустую дату. А пустая дата заведомо не попадает в диапазон между любыми не пустыми датами. И, поскольку интервал меньше месяца, то при переходе через новый год февраль по любому будет вне рассматриваемого диапазона.

Формально ошибка есть, но фактически она не влияет на результат.
...
Рейтинг: 0 / 0
выборка по дате
    #35891391
LUCIAN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bolik2k,
Для выборки работников(ещё неуволенных) с заданным возрастом WOZR за данный период DATN,DATK использую
представление с таки SQL-запросом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT Z2.fio, Z2.dr, Spod.naim1d AS naim1, Zn2.namd AS nam;
 FROM ;
     zar!z2,;
    zar!spod,;
    zar!zn2;
 WHERE ( ( ( (  Z2.spec = Zn2.ks;
   AND  Z2.kodotd = VAL(Spod.kodc) );
   AND  MONTH(Z2.dr) BETWEEN MONTH(?DATN) AND MONTH(?DATK) );
   AND  DAY(Z2.dr) BETWEEN DAY(?DATN) AND DAY(?DATK) );
   AND  IIF(?WOZR= 999 ,.T.,YEAR(?datn)-YEAR(dr)=?WOZR)  );
   AND  Z2.d_uwl = ( {^ 2099 / 12 / 31 } );
 ORDER BY Z2.dr
...
Рейтинг: 0 / 0
выборка по дате
    #35891515
GoshaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О Как :-)
за скорость обработки ничего не скажу, но на первый взгляд, должно отработать.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
ldStartDate=DATE()
ldEndDate=DATE()+ 7 
** dr-поле таблицы с датой рождения
where 
(
 !EMPTY(DATE(YEAR(ldStartDate),MONTH(dr),DAY(dr))) AND 
 (
  DATE(YEAR(ldStartDate),MONTH(dr),DAY(dr)) between ldStartDate and ldEndDate OR 
  DATE(YEAR( ldEndDate ),MONTH(dr),DAY(dr)) between ldStartDate and ldEndDate
 ) 
) OR 
(
 !EMPTY(DATE(YEAR(ldStartDate),MONTH(dr),DAY(dr))- 1 ) AND 
 (
  DATE(YEAR(ldStartDate),MONTH(dr),DAY(dr)- 1 ) between ldStartDate- 1  and ldEndDate- 1  OR 
  DATE(YEAR( ldEndDate ),MONTH(dr),DAY(dr)- 1 ) between ldStartDate- 1  and ldEndDate- 1  
  ) 
)
2 ВладимирМ
Ага, что-то не то написал, как в анекдоте про блондинку с двумя шоколадками по 10 рублей :-)
Работа все время отвлекает ;-)
...
Рейтинг: 0 / 0
выборка по дате
    #35891559
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 GoshaS

В функцию Date() недопустимо пердавать нулевые значения параметров.

Date(2000,1,0) - выдаст сообщение об ошибке и породит исключение. Т.е. SQL-запрос просто вылетит, если DAY(dr) - 1 = 0
...
Рейтинг: 0 / 0
выборка по дате
    #35891712
GoshaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
*конечно можно заменить
DAY(dr)- 1  
*на 
MAX(DAY(dr)- 1 , 1 )
но что-то конструкция уже получиться очень не красивая
...
Рейтинг: 0 / 0
выборка по дате
    #35891728
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GoshaS
Код: plaintext
1.
2.
3.
4.
*конечно можно заменить
DAY(dr)- 1  
*на 
MAX(DAY(dr)- 1 , 1 )
но что-то конструкция уже получиться очень не красивая
Дело не в красоте. В этом случае теряется смысл вашего кода. Вроде как вычитаем, а вроде и не вычитаем. В чем тогда смысл операции? Особенно, если конечная дата диапазона - это как раз первое число месяца?

Кстати, (Date() - 1) вовсе не то же самое, что DATE(..., DAY()-1) применительно к 1 числу месяца.
...
Рейтинг: 0 / 0
выборка по дате
    #35891792
GoshaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
*По сути, оно можно сделать гораздо проще и работать будет выборка гораздо быстрей.
*ошибок быть не должно, можно отправлять запросом на SQL сервак. 
lsDate=SET("Date")
SET DATE YMD 
ldDate=DATE( 2008 , 12 , 30 )
lcStartDate=RIGHT(DTOC(ldDate), 5 )
lcEndDate=RIGHT(DTOC(ldDate+ 7 ), 5 )
IF YEAR(ldDate)=YEAR(ldDate+ 7 )
	lcCondition="RIGHT(DTOC(dr),5) between lcStartDate and lcEndDate"
ELSE 
	lcCondition="RIGHT(DTOC(dr),5) between '01/01' and lcEndDate or RIGHT(DTOC(dr),5) between lcStartDate and '12/31'"
ENDIF 
SELECT * FROM c1 WHERE &lcCondition
SET DATE '&lsDate'
...
Рейтинг: 0 / 0
выборка по дате
    #35892125
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем-то, примерно с этого все и началось. Перечитайте еще раз первые ответы данной темы.

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

Т.е. вместо

Код: plaintext
1.
set date YMD
RIGHT(DTOC(), 5 )

используется просто

Код: plaintext
RIGHT(DTOS(), 4 )
...
Рейтинг: 0 / 0
выборка по дате
    #35954286
TempUsr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
здравствуйте!
вопрос не совсем в тему, но тоже касается даты (я посчитал, что он не достоин отдельной темы, поэтому пишу здесь)
у меня есть 3 переменных:
a=11 * месяц
b=10 * число
c=2000 * год

есть таблица БД с полем типа date

подскажите как записать в это поле дату, которую можно составить из этих переменных по событию "клик" кнопки?
а то я чувствую гугл скоро будет тошнить от моих запросов, т.к. все что я пытался сделать ни к чему не привело(((
...
Рейтинг: 0 / 0
выборка по дате
    #35954410
Dag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все слова в отдельности понятны, а вместе - нет. Не только гуголь встанет в тупик. В чем заключается сакральный смысл этих манипуляций ?
...
Рейтинг: 0 / 0
выборка по дате
    #35954498
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TempUsrздравствуйте!
вопрос не совсем в тему, но тоже касается даты (я посчитал, что он не достоин отдельной темы, поэтому пишу здесь)
у меня есть 3 переменных:
a=11 * месяц
b=10 * число
c=2000 * год

есть таблица БД с полем типа date

подскажите как записать в это поле дату, которую можно составить из этих переменных по событию "клик" кнопки?
а то я чувствую гугл скоро будет тошнить от моих запросов, т.к. все что я пытался сделать ни к чему не привело(((
Записать что-то в поле

Код: plaintext
REPLACE MyField WITH (значение)

Сформировать из известных значений Года, Месяца и Дня собственно дату можно несколькими способами

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
* Для версии VFP6 и старше
* Значение  0  в любом из параметров - не допустимо. Вызовет ошибку
?Date(Год, Месяц, День)

* Для любой версии
SET DATE GERMAN
lcDate = STR(День, 2 ) + "." + STR(Месяц, 2 ) + "." + STR(Год, 4 )
?CTOD(lcDate)
...
Рейтинг: 0 / 0
выборка по дате
    #35954561
TempUsr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
God = thisform.text7.Value
Mesyac = thisform.text6.Value
Den = thisform.text5.Value
SET DATE GERMAN
lcDate = STR(Den, 2 ) + "." + STR(Mesyac, 2 ) + "." + STR(God, 4 ) * <-- в этой строке ошибка
?CTOD(lcDate)
replace klient.data WITH lcDate

Ошибка: Function argument value, type or count is invalid
подскажите, что я опять не так делаю?
...
Рейтинг: 0 / 0
выборка по дате
    #35954566
TempUsr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dag
в поле data типа date таблицы БД хочу записать дату своего рождения, дата формируется из трех чисел - день, месяц, год, которые я получаю из компонент textbox
вот как-то так =)
...
Рейтинг: 0 / 0
выборка по дате
    #35954576
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TempUsr
Код: plaintext
1.
2.
3.
4.
5.
6.
God = thisform.text7.Value
Mesyac = thisform.text6.Value
Den = thisform.text5.Value
SET DATE GERMAN
lcDate = STR(Den, 2 ) + "." + STR(Mesyac, 2 ) + "." + STR(God, 4 ) * <-- в этой строке ошибка
?CTOD(lcDate)
replace klient.data WITH lcDate

Ошибка: Function argument value, type or count is invalid
подскажите, что я опять не так делаю?
По умолчанию, объект TextBox содержит информацию в символьном типе данных. А функция STR() предполагает преобразование числового типа в символьное представление. О чем вы должны были узнать прочитав справку по функции STR().

У вас два пути решения проблемы:

1. Указать объекту TextBox вводить данные в числовом типе данных. Это можно сделать задав значение TextBox.Value = 0 в дизайнере формы

2. Если вы оставляете символьный тип данных в объекте TextBox, то вместо функции STR() следует использовать функцию AllTrim() для отсечения возможных ведущих и концевых пробелов

Код: plaintext
lcDate = AllTrim(Den) + "." + AllTrim(Mesyac) + "." + AllTrim(God)

И еще, я бы вам настоятельно советовал, прежде чем спрашивать, прочитать справку в HELP по используемым функциям. Кроме того, при возникновении ошибки появляется диалоговое окно в котором есть кнопка Help. Если ее нажать, то открывается статья, в которой достаточно внятно объясняется причина ошибки и как ее исправить.
...
Рейтинг: 0 / 0
выборка по дате
    #35954616
TempUsr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автор кнопка Help. Если ее нажать, то открывается статья
об этом не знал, спасибо
и вообще за все спасибо, больше вы от меня глупых вопросов не услышите
...
Рейтинг: 0 / 0
выборка по дате
    #35964217
Disaer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
помогите плз /topic/660835&pg=-1
...
Рейтинг: 0 / 0
43 сообщений из 43, показаны все 2 страниц
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / выборка по дате
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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