Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.07.2012, 15:17   #1
alexvav
Форумчанин
 
Регистрация: 23.11.2006
Сообщений: 152
По умолчанию Выбор периода с исключением

Есть такой кусок кода:

Код:
  ADOQueryZAK.SQL.Add('where rabota.data >= :nachal_m AND rabota.data < :konec_m');
Отбирает данные с первого по последнее число месяца. Этот код работает, всё нормально.
А как написать, что бы, наоборот, отбирались все остальные записи? У которых дата не входит в период с первого по последнее число месяца.

Такой код работает некорректно:
Код:
  ADOQueryZAK.SQL.Add('where rabota.data < :nachal_m AND rabota.data > :konec_m');
alexvav вне форума Ответить с цитированием
Старый 04.07.2012, 15:26   #2
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

Код:
ADOQueryZAK.SQL.Add('where rabota.data < :nachal_m OR rabota.data > :konec_m');
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 04.07.2012, 15:28   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

либо
Код:
ADOQueryZAK.SQL.Add('where rabota.data < :nachal_m OR rabota.data > :konec_m');
либо (если в вашей СУБД есть операция NOT:
Цитата:
ADOQueryZAK.SQL.Add('where NOT (rabota.data >= :nachal_m AND rabota.data < :konec_m) ');
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.07.2012, 16:05   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Еще оптимальнее
Код:
WHERE NOT data BETWEEN :dtbeg AND :dtend
Здесь дата конечная попадает в интервал
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 04.07.2012, 16:07   #5
alexvav
Форумчанин
 
Регистрация: 23.11.2006
Сообщений: 152
Печаль

СУБД у меня Access.
Извиняюсь, что не показал полный код, может в этом проблема:

Код:
  tek_mes:= DateTimePicker6.DateTime;
  ADOQueryZAK.Close;
  ADOQueryZAK.SQL.Clear;
  ADOQueryZAK.SQL.Add('select zakaz.n_dog, zakaz.zak, zakaz.k_vo, zakaz.stok, zakaz.Data, zakaz.Adres ');
  ADOQueryZAK.SQL.Add('from zakaz ');
  ADOQueryZAK.SQL.Add('left join rabota ON rabota.n_dog = zakaz.n_dog ');
  ADOQueryZAK.SQL.Add('where rabota.data >= :nachal_m AND rabota.data < :konec_m');
  ADOQueryZAK.Parameters.ParamByName('nachal_m').Value:=StartOfTheMonth(tek_mes);
  ADOQueryZAK.Parameters.ParamByName('konec_m').Value:=EndOfTheMonth(tek_mes);
  ADOQueryZAK.Open;

Оба предложенных варианта работают и отбирают, но как?!
Выбираю заказчиков, у которых в 6 месяце не было оплаты. И на каждую удовлетворяющую условию запись добавляет строку заказчика (с января по апрель)
Изображения
Тип файла: jpg Безымянный.jpg (39.1 Кб, 53 просмотров)
alexvav вне форума Ответить с цитированием
Старый 04.07.2012, 16:13   #6
alexvav
Форумчанин
 
Регистрация: 23.11.2006
Сообщений: 152
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Еще оптимальнее
Код:
WHERE NOT data BETWEEN :dtbeg AND :dtend
Здесь дата конечная попадает в интервал
BETWEEN не годится из-за особенностей access.
alexvav вне форума Ответить с цитированием
Старый 04.07.2012, 17:04   #7
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

судя по картинке - одной строкой не получится т.к. групировке мешают разные даты
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 04.07.2012, 18:19   #8
alexvav
Форумчанин
 
Регистрация: 23.11.2006
Сообщений: 152
По умолчанию

А почему же при первом коде всё правильно делает? Отображает одну строку заказчика и кучу оплат по условию.

Наверно никому такое задание не попадалось раньше, а то уже бы предложили своё готовое решение
Склоняюсь попробовать вариант, типа: (01.01.1900 < rabota.data >:nachal_m) AND (konec_m < rabota.data > 01.01.2100)

Последний раз редактировалось alexvav; 04.07.2012 в 18:25.
alexvav вне форума Ответить с цитированием
Старый 04.07.2012, 21:18   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
А почему же при первом коде всё правильно делает?
А потому что логику включить надо в башке - первый код учитывает одновременно и первое и второе условие.
Второй же при неверном первом второе вообще может не проверять, потому что ты используешь AND. А послушай Юрка, и все будет чики-пики.
Не может быть значение rabota.data одновременно меньше начала и больше конца.
Изучай логические операции.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.07.2012, 12:58   #10
alexvav
Форумчанин
 
Регистрация: 23.11.2006
Сообщений: 152
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Не может быть значение rabota.data одновременно меньше начала и больше конца.
Я и не говорил, что может.
Мне просто надо вывести период исключающий текущий месяц.
Вложения
Тип файла: rar период.rar (21.2 Кб, 7 просмотров)
alexvav вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Связанные списки с исключением IOPNR Microsoft Office Excel 2 01.11.2011 08:55
Выбор периода в сводной таблице mrs.petrushina Microsoft Office Excel 2 08.03.2011 21:31
Выбор периода времени DateTimePicker AnkaP Общие вопросы Delphi 8 25.01.2010 18:41
Проблема с исключением try.....Except.... X-LEV-X Общие вопросы Delphi 1 28.07.2009 19:08
Выбор товара из раннего периода? ASR Microsoft Office Excel 11 28.01.2008 15:08