Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.05.2007, 09:47
Аватар для Сёна
Сёна Сёна вне форума
Прохожий
 
Регистрация: 02.05.2007
Адрес: Москва
Сообщения: 42
Версия Delphi: 7
Репутация: 10
По умолчанию Sql

Народ, подскажите пожалуйста, как произвести поиск в интервале дат через sql
Код:
clm.Close;
        clm.SQL.Clear;
         clm.SQL.Text:='select *'+
                       ' from my_live_rol'+
                       ' where (date_b=)and(date_e is null)';
date_b должна находиться в интревале от напр 11.03.2007 по сегодняшнее число
Подскажите please
Ответить с цитированием
  #2  
Старый 28.05.2007, 16:32
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

...WHERE date_b BETWEEN CONVERT(DATETIME, '11.03.2007', 104) AND сегодняшнее число спрашивать у базы данных (GETDATE()) или у Delphi (Today)?

104 означает формат dd.mm.yy (German). Если без функции Convert послать дату, то у БД может оказаться, напр., американский формат mm/dd/yy, т.е. месяцы и дни переставлены, и будет ошибка. Если границы дат не надо включать, то к минимальной границе надо прибавить один день, а от максимальной отнять (либо вместо Between использовать неравенства <, >)
Ответить с цитированием
  #3  
Старый 29.05.2007, 10:46
Аватар для Сёна
Сёна Сёна вне форума
Прохожий
 
Регистрация: 02.05.2007
Адрес: Москва
Сообщения: 42
Версия Delphi: 7
Репутация: 10
По умолчанию

Спасибо, большое : )
Подскажи мне пожалуста ещё ответ на один вопросик
Если дата должна быть в интервале от dt и dt0 типа string, хранящие даты.
Или как мне ещё сделать?
С таблицы и формы беру по дате и в 3ьей хочу найти запись в интревале этих дат.
Код:
dt:=datetostr(teku.FieldByName('NACH_CONP').AsDateTime);
      dt0:=datetostr(form1.DateTimePicker2.date);
Я уже запуталась
Ответить с цитированием
  #4  
Старый 29.05.2007, 12:44
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Цитата:
Сообщение от Сёна
Если дата должна быть в интервале от dt и dt0 типа string, хранящие даты.
Или как мне ещё сделать?
А где вопрос то?
Цитата:
Сообщение от Сёна
С таблицы и формы беру по дате и в 3ьей хочу найти запись в интревале этих дат.
В третьей чего? (таблице, форме)
Постарайся успокоиться, не нервничай, никто тебя не укусит. Ещё раз опиши задание (вопрос)
Ответить с цитированием
  #5  
Старый 29.05.2007, 15:21
Аватар для Сёна
Сёна Сёна вне форума
Прохожий
 
Регистрация: 02.05.2007
Адрес: Москва
Сообщения: 42
Версия Delphi: 7
Репутация: 10
По умолчанию

В общем, с таблицы я беру значение dt, а с формы получаю значение dt0, хочу организовать поиск в таблице my_live_rol по записям, у которых поле date_b находится в интнрвале от dt по dt0
Ответить с цитированием
  #6  
Старый 30.05.2007, 11:28
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Код:
var 
  dt: TDateField;
  sdt, sdt0: String;
Где-нибудь в OnCreate:
Код:
dt.DisplayFormat:= 'dd.mm.yyyy';
Строковое представление
Код:
sdt:= dt.AsString;
...
sdt0:= FormatDateTime('dd.mm.yyyy', DateTimePicker2.Date);
В select'е
Код:
...WHERE date_b BETWEEN CONVERT(DATETIME, sdt, 104)
  AND CONVERT(DATETIME, sdt0, 104)

Последний раз редактировалось AlexSku, 30.05.2007 в 11:33.
Ответить с цитированием
  #7  
Старый 30.05.2007, 11:50
Аватар для Сёна
Сёна Сёна вне форума
Прохожий
 
Регистрация: 02.05.2007
Адрес: Москва
Сообщения: 42
Версия Delphi: 7
Репутация: 10
По умолчанию

Большое спасибо
Ответить с цитированием
  #8  
Старый 31.05.2007, 11:01
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Извини, похоже, рано я тебя обнадёжил - забыл про апострофы (а как же можно сосредоточиться, глядя на такое фото?) и в результате строковые переменные попали вовнутрь константы. Надо было так:
Код:
clm.SQL.Text:='select *'+
' from my_live_rol'+
' where date_b between CONVERT(DATETIME, ' +
sdt + ', 104) and CONVERT(DATETIME, ' +
sdt0 + ', 104)'
Это я так делал не на Delphi, а на Java (БД MS SQL Server 2005), а на Delphi (БД InterBase) делал по-другому. Брал компоненты TIBTransaction и TIBQuery, в TIBQuery.SQL при проектировании записывал запрос с параметрами:
Код:
select *
from my_live_rol
where date_b between
CONVERT(DATETIME, :psdt, 104) and
CONVERT(DATETIME, :psdt0, 104)
Свойства параметров надо настроить (в Object Inspector):
DataType = ftString , ParamType = ptInput.
После открытия БД можно послать предварительную подготовку:
Код:
Query1.Prepare;
Тогда запрос будет быстро обрабатываться.
Код:
with Query1 do
begin
  Close;
  Params.ParamValues['psdt']:= sdt;
  Params.ParamValues['psdt0']:= sdt0;
  ExecSQL;
end;
Немного муторно, но интересно.
Ответить с цитированием
  #9  
Старый 04.06.2007, 09:40
Аватар для Сёна
Сёна Сёна вне форума
Прохожий
 
Регистрация: 02.05.2007
Адрес: Москва
Сообщения: 42
Версия Delphi: 7
Репутация: 10
По умолчанию

Спасибо за дополнение и за комплимент
Мне тоже нравиться что то на первый взгяд муторное, но интересное, просто иногда нет возможности по времени сидеть разбираться
Ответить с цитированием
  #10  
Старый 04.06.2007, 15:42
Аватар для Сёна
Сёна Сёна вне форума
Прохожий
 
Регистрация: 02.05.2007
Адрес: Москва
Сообщения: 42
Версия Delphi: 7
Репутация: 10
По умолчанию

неохота тебя расстраивать, но я или что то делаю не так, или не поняла.
Код:
live.Close;
   live.SQL.Clear;
    live.SQL.Text:='select l.rowid,l.ROL_PASP_ID,l.DATE_B,l.DATE_E,l.MNLZ,l.RU,l.RAD_ID,l.PRICH,l.COL_PL'+
                    ' from my_live_rol l'+
                    ' where (l.ROL_PASP_ID='+floattostr(rolk[i])+')and(l.DATE_E is null)and(l.DATE_B between convert(datetime,'+dt+',104) and convert(datetime,'+dt0+',104))';
       live.Open;
так должно всё это дело выглядеть?
при live.open получаю ошибку 'missing right parenthesis'
Ответить с цитированием
  #11  
Старый 05.06.2007, 10:34
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Ошибка чисто стилистическая - не хватает одной закрывающей скобки в конце (т.е. перед последним апострофом не 2, а 3 скобки. Часто помогает такой приём: скобки всегда вводить парой, а затем вписывать текст вовнутрь). Но после этого возможен другой подводный камень: в моём тексте я ввёл строковые представления для переменных (sdt и sdt0), а у тебя старый вариант - dt и dt0. Если это переменные не типа string, то будет ошибка.
Ответить с цитированием
  #12  
Старый 05.06.2007, 11:46
Аватар для Сёна
Сёна Сёна вне форума
Прохожий
 
Регистрация: 02.05.2007
Адрес: Москва
Сообщения: 42
Версия Delphi: 7
Репутация: 10
По умолчанию

Я всегда стараюсь вводить скобки парой, я перепроверяла, вроде все на месте. Добавила перед последним апострофом, та же ситуация(с ошибкой). Может я как то неправильно условия в скобки заключила?
dt,dt0 строкового типа, я немножко пределала поэтому они не sdt,sdt0
Ошибка всё та же
Ответить с цитированием
  #13  
Старый 05.06.2007, 18:31
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Извини, беру свои слова обратно. Я сам неправильно просчитал скобки. Но т.к. ошибка, что не хватает правой (т.е. закрывающей) скобки, то на всякий случай выведи значения dt и dt0 (напр., ShowMessage(dt); ShowMessage(dt0), может быть в них появились скобки?
Ответить с цитированием
  #14  
Старый 06.06.2007, 08:39
Аватар для Сёна
Сёна Сёна вне форума
Прохожий
 
Регистрация: 02.05.2007
Адрес: Москва
Сообщения: 42
Версия Delphi: 7
Репутация: 10
По умолчанию

Ты имеешь в виду в значениях dt и dt0? Я проыверяла, вроде всё в порядке. При пошаговой запрос выглядит так
Код:
..where (l.ROL_PASP_ID=16331)and(l.DATE_B between convert(datetime,11.03.2007,104) and convert(datetime,25.05.2007,104))and (l.DATE_E is null)'
А на строке live.open он выдаёт ошибку : (
Ответить с цитированием
  #15  
Старый 06.06.2007, 09:32
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

А если так попробовать:
Код:
..where (l.ROL_PASP_ID=16331)
 and 
(l.DATE_B between convert(datetime,'11.03.2007',104) and convert(datetime,'25.05.2007',104))
and (l.DATE_E is null)

в догонку: как-то не логично выбирать в запросе поле указав в условие его равнство null'у (DATE_E)
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:50.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025