powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / выборка по дате
18 сообщений из 43, страница 2 из 2
выборка по дате
    #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
18 сообщений из 43, страница 2 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / выборка по дате
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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