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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2011, 19:22   #1
polarity
Пользователь
 
Регистрация: 30.05.2010
Сообщений: 30
Восклицание SQL запросы.

Здраствуйте.

Есть база данных на парадоксе. Нужно написать запросы :
1) Удалить записи лиц со стажем > 20 лет.
2) Показать записи лиц, принятых на работу в определенный период.

1* Стаж - calculated поле. SQL на него ругается =\
2* Ругается на непонятный формат даты наверное.

Посмотрите, пожалуйста, что не так.
Вложения
Тип файла: rar exam.rar (355.6 Кб, 15 просмотров)
polarity вне форума Ответить с цитированием
Старый 24.06.2011, 03:36   #2
rdama
Форумчанин
 
Аватар для rdama
 
Регистрация: 25.07.2009
Сообщений: 533
По умолчанию

модуль DateUtils
Код:
'DELETE FROM General WHERE datepost <=' + QuotedStr(IntToStr(Dayof(Now)) + '.' + IntToStr(MonthOf(Now)) + '.' + IntToStr(YearOf(Now) - 20))
Единственное день и месяц возвращаются одной цифрой. Т.е. формат даты как 'd.m.yyy'. Может понадобиться добавление 0 в начало. Для приведения к формату 'dd.mm.yyyy'.
Маразм крепчал. Еноты пели...
R-style Dataknowlege Access Member Account (RDAMA)
rdama вне форума Ответить с цитированием
Старый 24.06.2011, 08:17   #3
polarity
Пользователь
 
Регистрация: 30.05.2010
Сообщений: 30
По умолчанию

Цитата:
Сообщение от rdama Посмотреть сообщение
модуль DateUtils
Код:
'DELETE FROM General WHERE datepost <=' + QuotedStr(IntToStr(Dayof(Now)) + '.' + IntToStr(MonthOf(Now)) + '.' + IntToStr(YearOf(Now) - 20))
Единственное день и месяц возвращаются одной цифрой. Т.е. формат даты как 'd.m.yyy'. Может понадобиться добавление 0 в начало. Для приведения к формату 'dd.mm.yyyy'.
Что-то удаляет вообще все записи.
polarity вне форума Ответить с цитированием
Старый 24.06.2011, 09:48   #4
rdama
Форумчанин
 
Аватар для rdama
 
Регистрация: 25.07.2009
Сообщений: 533
По умолчанию

Собери вот такой запрос.
Код:
SELECT * FROM General WHERE datepost <=' + QuotedStr(IntToStr(Dayof(Now)) + '.' + IntToStr(MonthOf(Now)) + '.' + IntToStr(YearOf(Now) - 20))
Что он возвращает? Все записи? Если да то надо смотреть почему условие не отрабатывает. Может BDE не принимает дату в таком формате. Посмотри в каком формате необходимо передать дату. И поправь запрос чтоб выбрал только то что надо.
Маразм крепчал. Еноты пели...
R-style Dataknowlege Access Member Account (RDAMA)
rdama вне форума Ответить с цитированием
Старый 24.06.2011, 10:06   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Посмотри в каком формате необходимо передать дату
ну взрослые, опытные люди, а до сих пор ещё не запомнили:
Чтобы в запросах не было проблем с датами, надо использовать параметрические запросы (дату в запрос передавать в виде параметра).
Это корректно работает со всеми СУБД!
Все остальные способы - глючные по определению! (даже если они и нормально работают - любое изменение формата локали, хоть на сервере, хоть на клиенте - и получаются отличные, трудновоспроизводимые и труднообнаруживаемые косяки!

(да, ещё вполне допустимым исключением является способ использования функций СУБД, когда передаётся строка в нужном формате и уже СУБД ещё приобразовывает в указанный явно в запросе формат (например, в Oracle это to_date(... ). Так тоже можно. Но это уже способ, который напрямую зависит от используемой СУБД )

Последний раз редактировалось Serge_Bliznykov; 24.06.2011 в 10:10.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.06.2011, 10:37   #6
polarity
Пользователь
 
Регистрация: 30.05.2010
Сообщений: 30
По умолчанию

Код:
with DataModule2.Query1 do
   try
    SQL.Text := 'delete from General where Datapost<:dt';
    ParamByName('dt').AsDateTime := StrToDateTime(QuotedStr(IntToStr(Dayof(Now))+ '.' + IntToStr(MonthOf(Now)) + '.' + IntToStr(YearOf(now)-20)));
    Open;
   except
     ShowMessage('Ошибка удаления');
   end;
Ничего не изменилось, тоже ошибки и удаляет все записи =\
polarity вне форума Ответить с цитированием
Старый 24.06.2011, 10:43   #7
rdama
Форумчанин
 
Аватар для rdama
 
Регистрация: 25.07.2009
Сообщений: 533
По умолчанию

Цитата:
взрослые, опытные люди
Не занимаются секасом с BDE. Так как знают что это грозит болезнями кормовой части.
А так да конечно параметром. В запрос параметр а дату для запроса можно так получить.
Код:
var a : Tdate;
begin
  a := Now - (20*365+5)
20*365 - 20 лет в днях
+5 - потерянные 5 дней (високосные года)
Пятница, конец рабочего дня. Голова вообще не варит.
Маразм крепчал. Еноты пели...
R-style Dataknowlege Access Member Account (RDAMA)
rdama вне форума Ответить с цитированием
Старый 24.06.2011, 10:53   #8
polarity
Пользователь
 
Регистрация: 30.05.2010
Сообщений: 30
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var a : Tdatetime;
begin
  with DataModule2.Query1 do
   try
   a := Now - (20*365+5);
    SQL.Text := 'delete from General where Datapost<'+datetostr(a);
   // ParamByName('dt').AsDateTime := StrToDateTime((IntToStr(Dayof(Now))+'.' + IntToStr(MonthOf(Now)) + '.' + IntToStr(YearOf(now)-20)));
    Open;
   except
     ShowMessage('Ошибка удаления');
     end;
  end;
Теперь ругается на то, что поле 'a' неизвестного формата.

А если так -
Код:
Datapost<'+datetostr(a);
То получается - DataPost<24.06 и опять ругается. Ппц какой-то)
polarity вне форума Ответить с цитированием
Старый 24.06.2011, 11:03   #9
rdama
Форумчанин
 
Аватар для rdama
 
Регистрация: 25.07.2009
Сообщений: 533
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var date1:tdatetime;
begin
  date1:=now - (20 * 365 + 5);
  DataModule2.Query1.Close;
  DataModule2.Query1.SQL.Clear;
 // DataModule2.Query1.SQL.Add('delete');
  DataModule2.Query1.SQL.Add('delete from General where DataPost < :dt');
//  DataModule2.Query1.SQL.Add('where General.Check>20');
  DataModule2.Query1.Params.ParamByName('dt').AsDate := date1;
  DataModule2.Query1.ExecSQL;
  DBGrid1.DataSource.DataSet.Refresh;
end;
Вот залез и поправил в твоём исходнике.
Но для вида лучше так
Код:
procedure TForm1.Button1Click(Sender: TObject);
var date1:tdatetime;
begin
  date1:=now - (20 * 365 + 5);
  with DataModule2.Query1 do   
  begin
     Close;
     SQL.Clear;
     SQL.Add('delete from General where DataPost < :dt');
     Params.ParamByName('dt').AsDate := date1;
     ExecSQL;
  end;
  DBGrid1.DataSource.DataSet.Refresh;
end;
Маразм крепчал. Еноты пели...
R-style Dataknowlege Access Member Account (RDAMA)

Последний раз редактировалось rdama; 24.06.2011 в 11:05.
rdama вне форума Ответить с цитированием
Старый 24.06.2011, 11:22   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
date1:=now - (20 * 365 + 5);
Не совсем корректно, что делать если не 20 а 19 или 17? Лучше
Код:
date1:=IncMonth(now,-240)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
sql запросы Sol' Помощь студентам 0 25.05.2011 15:02
SQL-запросы Серёга Русич Помощь студентам 5 11.05.2011 19:54
sql запросы пупсиг Помощь студентам 2 08.01.2011 23:50
SQL запросы dymych Помощь студентам 9 21.06.2010 08:38
sql запросы wolf950 БД в Delphi 2 28.11.2008 21:26