Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
 Аватар для Romich41
16 / 16 / 1
Регистрация: 01.11.2009
Сообщений: 188

Запрос SQL

29.12.2010, 16:21. Показов 1973. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Люди с наступающим=)
Есть вопрос: мне нужно сделать запрос работников, у которых есть дети до 16 лет.
Я пишу так:
Delphi
1
2
3
4
5
6
var year: string;
begin
DataModule3.SpisokRabQuery.Active := false;  //отключение SpisokRabQuery
DataModule3.SpisokRabQuery.SQL.Text := 'Select ФИО FROM Rab,Family JOIN Family ON WHERE ДатаРождСын.Family < '+year+' AND ДатаРождДочь.Family < '+year+'';
DataModule3.SpisokRabQuery.Active := true;   //включение SpisokRabQuery
end;
А как можно грамматно посчитать ДАТУ, которую нужно занести в переменную year? Ну я думаю: как-то посчитать текущую дату компьютера, потом от нее отнять как-то 16 лет и результат занести в year.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.12.2010, 16:21
Ответы с готовыми решениями:

SQL запрос, работающий в MS SQL Menegment'e не работает в делфи
Требуется выполнить запрос по нажатию кнопки, запрос сначала написал в Microsoft SQL Managment, где и написал свою БД, там запрос работает,...

SQL запрос по фрагменту строки сохраненной в таблице SQL
Прошу помощи. Есть SQL таблица-1, в ней есть столбец по имени Model_Vagona с типом данных ntext Есть SQL таблица-2, в ней есть столбец...

SQL и ComboBox в Delphi. Нужно чтобы при выборе специальности в комбобоксе это значение вносилось в SQL запрос
procedure TForm3.Button2Click(Sender: TObject); begin try ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('SELECT Абитуриент.фамилия,...

17
 Аватар для arni
914 / 879 / 62
Регистрация: 06.01.2010
Сообщений: 2,367
Записей в блоге: 6
29.12.2010, 17:08
1) Не надо считать дату (и не надо тянуть вычисление YEAR на клиента), пусть сама СУБД отсчитает 16 лет назад. Вы только название СУБД скажите, чтобы имя функции корректно подобрать.
2)
SQL
1
FROM Rab,Family JOIN Family ON WHERE
тут 2 ошибки разом
3)
SQL
1
ДатаРождСын.Family  AND  ДатаРождДочь.Family
тут телега впереди лошади с идентификаторами, плюс ахтунг в нормализации, и вероятно неверный выбор оператора-связки предикатов
1
 Аватар для Romich41
16 / 16 / 1
Регистрация: 01.11.2009
Сообщений: 188
29.12.2010, 23:19  [ТС]
А можно подробнее как считать 16 лет назад?
0
 Аватар для arni
914 / 879 / 62
Регистрация: 06.01.2010
Сообщений: 2,367
Записей в блоге: 6
29.12.2010, 23:40
Цитата Сообщение от Romich41 Посмотреть сообщение
А можно подробнее как считать 16 лет назад?
необходимое условие озвучено:
только название СУБД скажите, чтобы имя функции корректно подобрать
1
 Аватар для Romich41
16 / 16 / 1
Регистрация: 01.11.2009
Сообщений: 188
30.12.2010, 09:39  [ТС]
ну допустим OtdelKadrov.
и все навно не понимаю как мне от даты (11.01.2006) отнять 16 ???
0
1263 / 706 / 62
Регистрация: 21.12.2009
Сообщений: 2,256
30.12.2010, 10:33
Romich41, Вам очень внятно предложил Arni
Вы только название СУБД скажите, чтобы имя функции корректно подобрать
Так сообщите название СУБД! OtdelKadrov - это не СУБД, а, скорее всего, название базы данных.
1
 Аватар для Sergiuz
161 / 159 / 39
Регистрация: 10.10.2010
Сообщений: 461
30.12.2010, 11:58
Romich41, Очень хорошо было бы действительно оставить выполнение запроса внутри СУБД
Но если же тебе хочется сделать внутри программы то вот будет тебе функция в помощь
Delphi
1
2
3
4
5
6
7
8
function SixtennYear (var InDate: TdateTime): TDateTime;
var
yy,mm,dd: word;
begin
 DecodeDate(inDate, yy, mm, dd);
 yy:=yy-16;
 Result:=EncodeDate(yy,mm,dd);
end;
Вот тебе функция от заданой даты отнимает 16 лет
1
 Аватар для Romich41
16 / 16 / 1
Регистрация: 01.11.2009
Сообщений: 188
30.12.2010, 12:44  [ТС]
SAMZ, что-то я запутался!!! я не знаю название СУБД, а где я его мог задать???=(
Sergiuz, эта функция только от заданной даты??? а как можно сделать относительно текущей даты компа?
0
1263 / 706 / 62
Регистрация: 21.12.2009
Сообщений: 2,256
30.12.2010, 14:09
Цитата Сообщение от Romich41 Посмотреть сообщение
что-то я запутался!!! я не знаю название СУБД
Ну, артист! Базу то как создавали, какими средствами. СУБД, как вариант, может быть Paradox, SQL Server, Oracle, Access, FireBird, FoxPro. Этот списоп можно продолжать очень долго.
а как можно сделать относительно текущей даты компа
Функция Date вернет текущую дату компа.
1
 Аватар для Romich41
16 / 16 / 1
Регистрация: 01.11.2009
Сообщений: 188
30.12.2010, 15:47  [ТС]
ну я в Акссесе делал=) БД сохранена в файле OtdelKadrov.mdb, а в Делфи работаю с помощью технологии АДО
0
1866 / 1186 / 192
Регистрация: 27.03.2009
Сообщений: 4,603
30.12.2010, 16:01
текущая дата now(). функция может быть таже
1
 Аватар для Romich41
16 / 16 / 1
Регистрация: 01.11.2009
Сообщений: 188
03.01.2011, 18:19  [ТС]
люди помогите исправить ОШИБКИ в запросе
SQL
1
[B]SELECT ФИО.Rab FROM Rab,Family WHERE (ДатаРождСын.Family < '+Result+') AND (ДатаРождДочь.Family < '+Result+')[/B]
0
1263 / 706 / 62
Регистрация: 21.12.2009
Сообщений: 2,256
03.01.2011, 20:43
Romich41, Такое впечатление, что в тексте запроса специально все перевернуто.
Если набор формируется из двух таблиц и, наколько можно понять - это таблицы Rab и Family, то при обращении к полям вначале в качестве квалификатора указывается имя или алиас таблицы, а потом имя поля. Таким образом у Вас в начальной части запроса должно быть
SQL
1
SELECT Rab.ФИО FROM Rab, Family
Далее, в запросе Вы используете неявное соединение таблиц Rab и Family. При таком соединении в предикате Where надо указывать ограничение для такого соединения. В противном случае получите так называемое Декартово произведение двух множеств. Поясню: таблица Rab - это, по-видимому, таблица работников и у нее должно быть поле первичного ключа, уникальным образом идентифицирующее работника. Пусть это поле ID. Таблица Family - это, скорее всего, члены семьи работника. Если у Вас правильно все спроектировано, то каждая запись в этой таблице должна иметь код работника, к торому относится эта запись. Пусть это поле IDRAB. Тогда Ваш запрос представится в виде
SQL
1
2
SELECT Rab.ФИО FROM Rab, Family
WHERE Rab.ID = Fanily.IDRAB
В таком виде запрос выглядит более логично, но такая организация соединений это - дурной тон. В данном случае используют явное внутреннее соединение
SQL
1
2
SELECT R.ФИО FROM Rab R
INNER JOIN Family F ON F.IDRAB = R.ID
Здесь кроме явного соединения использованы еще и алиасы (псевдонимы) таблиц
Ну и наконец добавляете секцию WHERE, в которой и отфильтровываете то, что Вам необходимо. Только при этом, конечно же пишете не
ДатаРождСын.Family
а F.ДатаРождСын
Я не полез в разбор Ваших кавычек
Цитата Сообщение от Romich41 Посмотреть сообщение
'+Result+'
Но, по моему, здесь тоже базар!
1
 Аватар для Romich41
16 / 16 / 1
Регистрация: 01.11.2009
Сообщений: 188
04.01.2011, 14:31  [ТС]
если тут выйграю немного денег...
SAMZ, скажешь мне свой ВебМАни!? я те 10 баксов кину...
Ты молодец...

Добавлено через 14 минут
Ну вот что получилось:
Delphi
1
DataModule3.SpisokRabQuery.SQL.Text := 'SELECT R.ФИО FROM Rab R INNER JOIN Family F ON F.КодРаботника = R.КодРаботника WHERE (F.ДатаРождСына < '+Result+') AND (F.ДатаРождДочь < '+Result+')';
переменная Result имеет тип string и в нее дата заносится (Result = 19.01.2000)...
у меня выбивает следующую ошибку:
"Число содержит синтак.ошибку в выражении запроса '(F.ДатаРождСына < '+Result+') AND (F.ДатаРождДочь < '+Result+')'"
В чем может быть проблема????
0
 Аватар для Sergiuz
161 / 159 / 39
Регистрация: 10.10.2010
Сообщений: 461
04.01.2011, 14:33
Цитата Сообщение от Romich41 Посмотреть сообщение
"Число содержит синтак.ошибку в выражении запроса '(F.ДатаРождСына < '+Result+') AND (F.ДатаРождДочь < '+Result+')'"
Попробуй кавычки добавит в запрос
1
 Аватар для Romich41
16 / 16 / 1
Регистрация: 01.11.2009
Сообщений: 188
04.01.2011, 15:27  [ТС]
а куда именно? одиночные?

Добавлено через 4 минуты
ну все добавил:
Delphi
1
DataModule3.SpisokRabQuery.SQL.Text := 'SELECT R.ФИО FROM Rab R INNER JOIN Family F ON F.КодРаботника = R.КодРаботника WHERE (F.ДатаРождСына < "'+Result+'") AND (F.ДатаРождДочь < "'+Result+'")';
теперь выбивает ошибку:
Параметр F.ДатаРождСына не имеет значения по умолчанию
А это как исправить??=(

Добавлено через 2 минуты
все понял=) я просто изменил это поле в самой БД...

Добавлено через 13 минут
теперь происходит несоответствие типов=(
переменная Result имеет тип string, а я ее сравниваю с Датой...
Если Result делаю TDateTime, тогда при DataModule3.SpisokRabQuery.SQL.Text Делфи ругается, т.к это string.
Попробывал в самой Бд тип ДатаРождСына поменять на текстовый, но так же выбивает ошибку!!!

ЧТО ДЕЛАТЬ?
0
1263 / 706 / 62
Регистрация: 21.12.2009
Сообщений: 2,256
04.01.2011, 19:13
Цитата Сообщение от Romich41 Посмотреть сообщение
скажешь мне свой ВебМАни!? я те 10 баксов кину...
Раздай в Рождество на паперти, я как-нибудь без тебя заработаю.

Добавлено через 2 минуты
Цитата Сообщение от Romich41 Посмотреть сообщение
Делфи ругается, т.к это string
Есть такие функции DateToStr и StrToDate
1
 Аватар для Romich41
16 / 16 / 1
Регистрация: 01.11.2009
Сообщений: 188
05.01.2011, 13:00  [ТС]
DateToStr и StrToDate - знаю такие...я пробывал в свой код написать....но без результатно!

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TForm1.ComboBox1Change(Sender: TObject);
var
yy,mm,dd: word;
Result: string;
begin
if  ComboBox1.ItemIndex = 1 then
begin
 DecodeDate(Date, yy, mm, dd);            //разбиваем текущую дату на состовляющие
 yy:=yy-16;                               //вычитам 16 лет
 Result:=DateToStr(EncodeDate(yy,mm,dd)); //и заносим результат в переменную
DataModule3.SpisokRabQuery.Active := false;  //отключение SpisokRabQuery
DataModule3.SpisokRabQuery.SQL.Text := 'SELECT R.ФИО FROM Rab R INNER JOIN Family F ON F.КодРаботника = R.КодРаботника WHERE (F.ДатаРождСын1 < "'+Result+'") AND (F.ДатаРождДочь1 < "'+Result+'")';
DataModule3.SpisokRabQuery.Active := true;   //включение SpisokRabQuery
end;
end;
Добавлено через 16 часов 25 минут
я сделал так!!!
Delphi
1
2
3
4
5
6
7
8
9
 DecodeDate(Date, yy, mm, dd);            
 yy:=yy-16;                               
 Result:= DateToStr(EncodeDate(yy,mm,dd)); 
 
DataModule3.SpisokRabQuery.Active := false;  
dds1 := DataModule3.FamilySource.DataSet.FieldByName('ДатаРождСын1').AsString;
ddd1 := DataModule3.FamilySource.DataSet.FieldByName('ДатаРождДочь1').AsString;
DataModule3.SpisokRabQuery.SQL.Text := 'SELECT Rab.ФИО FROM Rab INNER JOIN Family ON Family.КодРаботника = Rab.КодРаботника WHERE ("'+dds1+'" < "'+Result+'") AND ("'+ddd1+'" < "'+Result+'")';
DataModule3.SpisokRabQuery.Active := true;
мне пишет ошибку, типа КодРаботника not found (не наден!) что делать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.01.2011, 13:00
Помогаю со студенческими работами здесь

SQL запрос к БД
Доброго времени суток. Мне необходимо выполнить такой запрос: sqlStr:='select' + #13#10 + ' entrycode as...

запрос SQL
есть бд библиотека (сделанной в sql server), в ней таблица читателей с полями даты взятия книги, даты возврата книги и номера взятого...

Запрос sql
AdoQuery1.SQL.Text:='SELECT id,fio,svp,msis,os,kg,oevm,istdag, AVG(svp) AS ok FROM att) '; Как правильно запрос организовать? чтобы...

SQL запрос
DataModule2.ADOQuery1.Active:=false; DataModule2.ADOQuery1.SQL.Clear; DataModule2.ADOQuery1.SQL.Add('INSERT INTO Klienti'+ ...

SQL запрос
Осуществила SQL запрос в Access, скопировала код запроса, подскажите пожалуйста, как теперь мне вызвать этот запрос в delphi? В...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru