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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.01.2015, 17: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, 18:13   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

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

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

Так можно и за конкретный месяц всех лет выбрать. Нужно и год учитывать. Можно и в запросе манипулируя с Now и функциями даты-времени выдергивания года и месяца и сдвига на месяц это сделать, можно сделать с BETWEEN дата_первого_числа_месяца AND дата_последнего_числа_месяца. Сделал бы 2-ым способом - быстрее будет и даты начала-конца в клиентской программе сформировал, а не в запросе
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.01.2015, 10: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, 10:57   #6
lomastr_
Форумчанин
 
Регистрация: 16.01.2015
Сообщений: 672
По умолчанию

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

Цитата:
как пришло в голову
Поэтому и получается говнокод.
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 в 11:07.
Аватар вне форума Ответить с цитированием
Старый 22.01.2015, 11:14   #8
Konstantin_ua
Не судите строго
Форумчанин
 
Аватар для Konstantin_ua
 
Регистрация: 31.03.2011
Сообщений: 202
По умолчанию

Цитата:
Сообщение от lomastr_ Посмотреть сообщение
А тут и так 1 строка запроса, где вы больше видите?
А вот что в коде делфи непонятно, с инициализацией параметров совсем плохо.
Что за строка для poplata? и зачем FormatDateTime?
как бы вы реализовали выборку записей з БД к примеру за прошлый месяц?
Konstantin_ua вне форума Ответить с цитированием
Старый 22.01.2015, 11: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, 12:17   #10
lomastr_
Форумчанин
 
Регистрация: 16.01.2015
Сообщений: 672
По умолчанию

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


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выборка по дате 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