Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

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

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 21.01.2015, 18:56   #1
Konstantin_ua
Не судите строго
Форумчанин
 
Аватар для Konstantin_ua
 
Регистрация: 31.03.2011
Сообщений: 202
По умолчанию Выборка по дате sql

Привет всем.
Нужно выбрать все записи за прошлый месяц, запрос вот такой
Код:
 
SQL.Add('SELECT * FROM Dok WHERE Month([Rah_date])= Month(ADDDATE(now(), INTERVAL -1 Month)) ');

Выдает ошибку "Неопознаная ошибка"
Спасибо за помощь.
Konstantin_ua вне форума Ответить с цитированием
Старый 21.01.2015, 19:13   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,840
По умолчанию

Код:
SQL.Add('SELECT * FROM Dok WHERE Month([Rah_date])= Month(now())-1');
не?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.01.2015, 19:17   #3
Konstantin_ua
Не судите строго
Форумчанин
 
Аватар для Konstantin_ua
 
Регистрация: 31.03.2011
Сообщений: 202
По умолчанию

а если месяц 1-вый?
Konstantin_ua вне форума Ответить с цитированием
Старый 21.01.2015, 20:31   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,061
По умолчанию

Так можно и за конкретный месяц всех лет выбрать. Нужно и год учитывать. Можно и в запросе манипулируя с Now и функциями даты-времени выдергивания года и месяца и сдвига на месяц это сделать, можно сделать с BETWEEN дата_первого_числа_месяца AND дата_последнего_числа_месяца. Сделал бы 2-ым способом - быстрее будет и даты начала-конца в клиентской программе сформировал, а не в запросе
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.01.2015, 11:38   #5
Konstantin_ua
Не судите строго
Форумчанин
 
Аватар для Konstantin_ua
 
Регистрация: 31.03.2011
Сообщений: 202
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Так можно и за конкретный месяц всех лет выбрать. Нужно и год учитывать. Можно и в запросе манипулируя с Now и функциями даты-времени выдергивания года и месяца и сдвига на месяц это сделать, можно сделать с BETWEEN дата_первого_числа_месяца AND дата_последнего_числа_месяца. Сделал бы 2-ым способом - быстрее будет и даты начала-конца в клиентской программе сформировал, а не в запросе
я и делал при помощи beetween и AND, но только давно, а теперь хотелось улучшить код, а то почему то он мне на говно код похож. Вот например для следующего месяца.
Код:
DecodeDate(Now, myYear, myMonth, myDay);
if(myMonth<10) then mmyMonth:='0'+Inttostr(myMonth+1) else mmyMonth:=IntToStr(myMonth+1);
          if(myMonth=12) then begin mmyMonth:='01'; mmyYear:=IntToStr(myYear+1); end;
          na:=IntToStr(daysinamonth(myYear,myMonth+1));
          mmyDay:='01';
          etoday:=(mmyDay+'.'+ mmyMonth+'.'+mmyyear);
          eetoday:=(na+'.'+mmyMonth+'.'+mmyyear);
          SQL.Clear;
          SQL.Add('SELECT * FROM Dok WHERE oplata=poplata AND  Dov_date BETWEEN data AND  edata');
          Parameters.ParamByName('poplata').Value:='îïëà÷åíî';
          Parameters.ParamByName('data').Value:=FormatDateTime('ddddd',StrToDate(etoday));
          Parameters.ParamByName('edata').Value:=FormatDateTime('ddddd',StrToDate(eetoday));
          Active:=True;
          ShowMessage('Yaer'+mmyYear+'Month'+mmyMonth+' day'+mmyDay);
          ShowMessage('Yaer'+mmyYear+' Month'+mmyMonth+' day'+na);
может код можно и лучше написать, но делал так как пришло в голову, но еслы бы вместо всего этого была только одна строчка запроса было бы понятней.
Konstantin_ua вне форума Ответить с цитированием
Старый 22.01.2015, 11:57   #6
lomastr_
Форумчанин
 
Регистрация: 16.01.2015
Сообщений: 672
По умолчанию

А тут и так 1 строка запроса, где вы больше видите?
А вот что в коде делфи непонятно, с инициализацией параметров совсем плохо.
Что за строка для poplata? и зачем FormatDateTime?
lomastr_ вне форума Ответить с цитированием
Старый 22.01.2015, 12:05   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,061
По умолчанию

Цитата:
как пришло в голову
Поэтому и получается говнокод.
d1 - дата первого числа предшествующего месяца
d2 - дата последнего числа предшествующего месяца
Запрос при условии, что Dov_date типа дата-время и время в нем 0. Если есть время так не пойдет
Код:
var d1,d2: TDateTime;
...
  d1:=IncDay(IncMonth(Date,-1),1-DayOf(IncMonth(Date,-1)));
  d2:=IncMonth(d1,1)-1;
...
  SQL.Add('SELECT * FROM Dok WHERE oplata=poplata AND  Dov_date BETWEEN :d1 AND :d2');
  Parameters.ParamByName('d1').Value:=d1;
  Parameters.ParamByName('d2').Value:=d2;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 22.01.2015 в 12:07.
Аватар вне форума Ответить с цитированием
Старый 22.01.2015, 12:14   #8
Konstantin_ua
Не судите строго
Форумчанин
 
Аватар для Konstantin_ua
 
Регистрация: 31.03.2011
Сообщений: 202
По умолчанию

Цитата:
Сообщение от lomastr_ Посмотреть сообщение
А тут и так 1 строка запроса, где вы больше видите?
А вот что в коде делфи непонятно, с инициализацией параметров совсем плохо.
Что за строка для poplata? и зачем FormatDateTime?
как бы вы реализовали выборку записей з БД к примеру за прошлый месяц?
Konstantin_ua вне форума Ответить с цитированием
Старый 22.01.2015, 12:17   #9
Konstantin_ua
Не судите строго
Форумчанин
 
Аватар для Konstantin_ua
 
Регистрация: 31.03.2011
Сообщений: 202
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Поэтому и получается говнокод.
d1 - дата первого числа предшествующего месяца
d2 - дата последнего числа предшествующего месяца
Запрос при условии, что Dov_date типа дата-время и время в нем 0. Если есть время так не пойдет
Код:
var d1,d2: TDateTime;
...
  d1:=IncDay(IncMonth(Date,-1),1-DayOf(IncMonth(Date,-1)));
  d2:=IncMonth(d1,1)-1;
...
  SQL.Add('SELECT * FROM Dok WHERE oplata=poplata AND  Dov_date BETWEEN :d1 AND :d2');
  Parameters.ParamByName('d1').Value:=d1;
  Parameters.ParamByName('d2').Value:=d2;
Спасибо, с типом датавремя просто мало работал, теперь буду знать как правильно.
Konstantin_ua вне форума Ответить с цитированием
Старый 22.01.2015, 13:17   #10
lomastr_
Форумчанин
 
Регистрация: 16.01.2015
Сообщений: 672
По умолчанию

Цитата:
как бы вы реализовали выборку записей з БД к примеру за прошлый месяц?
чтобы датами занималась база надо знать субд, судя по топику это MySQL? тогда примерно так -
LAST_DAY(DATE_ADD(NOW(), INTERVAL 1 MONTH)) -- последний день предыдущего месяца
таким же макаром и 1 день
lomastr_ вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выборка по дате Extril Microsoft Office Excel 3 10.12.2013 10:12
выборка по дате Anariem SQL, базы данных 1 31.07.2013 08:17
ADOQuery + SQL-выборка по дате!!! $T@LKER БД в Delphi 14 19.04.2010 11:34
выборка по дате vaga Microsoft Office Access 10 11.10.2009 04:21


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS