Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.06;
Скачать: CL | DM;

Вниз

Вопрос по SQL запросу   Найти похожие ветки 

 
Руслана   (2005-01-31 20:58) [0]

Имеется DBGridEH подключенный через ADOQuery к базе Acces.
Каждая запись имеет свою дату отображаемую в определенном столбце. Как сформировать SQL запрос "Отобразить записи за последние 3 дня"?
Даты записаны в таком формате 31/01/05
Причем запросы могут быть разными (за 3 дня, за неделю, за месяц и т.д)
Заранее благодарна!


 
Anatoly Podgoretsky ©   (2005-01-31 21:05) [1]

Не важно в каком формате, используй параметры, а параметру присвой значение Date - N, где Т количество предыдущих дней.
Пример

"... where DateField>=:D";
.ParamByName("D").Value := Date - 3;


 
Anatoly Podgoretsky ©   (2005-01-31 21:06) [2]

Примечание: Даты записаны в таком формате 31/01/05 так можно говорить, если даты в таблицы не даты, а строки.


 
Руслана   (2005-01-31 21:08) [3]

Сейчас попробую, спасибо!


 
Руслана   (2005-01-31 21:24) [4]

To Anatoly Podgoretsky - а не могли бы Вы написать полностью запрос. Что-то я не понимаю
Поле с датой имеет имя [Дата]
DataModule1.BookName.Active:=false;
DataModule1.BookName.SQL.Clear;
DataModule1.BookName.SQL.Add("SELECT *");
DataModule1.BookName.SQL.Add("FROM Справочник1 ");
DataModule1.BookName.SQL.Add("WHERE [Дата]>=Date-3");
DataModule1.BookName.Active:=true;


 
Desdechado ©   (2005-01-31 21:34) [5]

тебе ж сказали - параметры
DataModule1.BookName.SQL.Add("SELECT *");
DataModule1.BookName.SQL.Add("FROM Справочник1 ");
DataModule1.BookName.SQL.Add("WHERE [Дата]>=:D");
DataModule1.BookName.ParamByName("D").Value := Date - 3;
DataModule1.BookName.Open;


 
Руслана   (2005-01-31 21:38) [6]

Пишет ошибку
Undeclared identifer "ParamByName"


 
Anatoly Podgoretsky ©   (2005-01-31 21:39) [7]

DataModule1.BookName.Active:=false;
DataModule1.BookName.SQL.Clear;
DataModule1.BookName.SQL.Add("SELECT *");
DataModule1.BookName.SQL.Add("FROM [Справочник1]");
DataModule1.BookName.SQL.Add("WHERE [Дата]>=:D");
DataModule1.BookName.Parameters.ParseSQL(DataModule1.BookName.SQL.Text, TRUE);
DataModule1.BookName.Parameters.ParamByName("D").Value := Date-3;
DataModule1.BookName.Active:=true;

Это для АДО, для других аналогично, только названия свойств могут быть другие. Вместо -3 любое другое значение.
[Справочник1] тоже надо в скобках!!!


 
Anatoly Podgoretsky ©   (2005-01-31 21:41) [8]

Если этот же код введен в SQL в дизайн тайм, то ParseSQL можно опустить.


 
Johnmen ©   (2005-01-31 21:42) [9]

>Anatoly Podgoretsky ©  (31.01.05 21:39) [7]
>DataModule1.BookName.Parameters.ParseSQL(DataModule1.BookName.SQL.Text, TRUE);

Это лишнее...:)


 
Anatoly Podgoretsky ©   (2005-01-31 21:48) [10]

Как сказать, для вручную формируемых запросов не лишнее. Если запрос создан в дизайн тайм и созданы параметры, то конечно лищнее, но это я отметил в дополнении. Без ParseSQL могут быть казусы, правда и с ним могут быть.


 
Johnmen ©   (2005-01-31 21:51) [11]

М.б. и могут... Но я лично не сталкивался.


 
Руслана   (2005-01-31 22:56) [12]

DataModule1.BookName.Parameters.ParamByName("D").Value := Date-3; - При это конструкции не отображается ни одной записи

DataModule1.BookName.Parameters.ParamByName("D").Value := Date -
При этой отображаются сегодняшние записи

DataModule1.BookName.Parameters.ParamByName("D").Value := Date-0
При этой снова ничего не отображается
Почему?


 
ЮЮ ©   (2005-02-01 05:08) [13]

Тогда попробуй ParamByName("D").asDateTime :=  Date - 3


 
Руслана   (2005-02-01 23:27) [14]

Если DataModule1.BookName.Parameters.ParamByName("D").asDateTime
то выдает ошибку "Undeclared identifer asDateTime"


 
ЮЮ ©   (2005-02-02 03:54) [15]

Cорри, тогда

ParamByName("D").DataType := ftDateTime;
ParamByName("D").Value := Date() - 3;


 
Руслана   (2005-02-03 16:23) [16]

Работает, но как-то странно.
Отобразить за 3 дня - отображаються записи
29/01/05
30/01/05
31/01/05
03/02/05

а записи за 01/02/05 и 02/02/05 не отображаются.
Такое чуство что число отнимается только от даты (не учитывается месяц и год)


 
Sergey13 ©   (2005-02-03 16:27) [17]

2[16] Руслана   (03.02.05 16:23)
Может они по другой причине не отбражаются?
Код и запрос трудно привести?


 
Руслана   (2005-02-03 16:30) [18]

var S:string;
begin
S:= FormatDateTime("dd/mm/yy", (Date-3);
DataModule1.BookName.Active:=false;
DataModule1.BookName.SQL.Clear;
DataModule1.BookName.SQL.Add("SELECT *");
DataModule1.BookName.SQL.Add("FROM [Справочник1]");
DataModule1.BookName.SQL.Add("WHERE [Дата]>=:D");
DataModule1.BookName.Parameters.ParamByName("D").Value := S;
DataModule1.BookName.Active:=true;

Пробовала как писал Анатолий - вообще ничего не отображается, почему - загадка


 
Johnmen ©   (2005-02-03 16:39) [19]

Так поле с датой у тебя символьное !!! И по умолчанию АДО думает, что месяц на втором месте, когда выполняются неявные преобразования типов.
Сделай по-человечески, и будет счастье...


 
Sergey13 ©   (2005-02-03 16:39) [20]

2[18] Руслана   (03.02.05 16:30)
Так у тебя поле [Дата] какого типа? Стринговое что ли? Если да, то чего же ты хочешь?


 
Соловьев ©   (2005-02-03 16:40) [21]

DataModule1.BookName.Active:=false;
DataModule1.BookName.SQL.Clear;
DataModule1.BookName.SQL.Add("SELECT *");
DataModule1.BookName.SQL.Add("FROM [Справочник1]");
DataModule1.BookName.SQL.Add("WHERE [Дата]>=:D");
DataModule1.BookName.ParamCheck := true;
DataModule1.BookName.Parameters[0].Value := Date - 3;
DataModule1.BookName.Active:=true;


 
Руслана   (2005-02-03 16:45) [22]

У меня поле дата символьное. И как мне составить запрос?


 
Соловьев ©   (2005-02-03 16:47) [23]


> У меня поле дата символьное.

сделать его датой - или проблем не оберешся.

> И как мне составить запрос?

а потом  - тебе уже кучу правильніх ответов дали.


 
Sergey13 ©   (2005-02-03 16:51) [24]

А в аксесе нет аналога оракловой TO_DATE?


 
Соловьев ©   (2005-02-03 17:02) [25]


> А в аксесе нет аналога оракловой TO_DATE?

CDate("29/01/05")


 
Соловьев ©   (2005-02-03 17:16) [26]

Можно попробовать...

...
DataModule1.BookName.SQL.Add("SELECT *");
DataModule1.BookName.SQL.Add("FROM [Справочник1]");
DataModule1.BookName.SQL.Add("WHERE CDate([Дата])>=:D");
...


 
sniknik ©   (2005-02-03 17:59) [27]

с символьной датой хлебнеш таки горя... ;о)) лучше делать обратные преобразования (из даты в строку), а еще лучше не делать вообще, работать как с датой.
для интересующихся, выполните не поленитесь запросик
SELECT CDate("29/01/05") AS D1, CDate("01/29/05") AS D2
и сравните результаты.

(можно обойти ;о), но зачем? дата еше и быстрее)


 
Соловьев ©   (2005-02-03 18:13) [28]


> для интересующихся, выполните не поленитесь запросик
> SELECT CDate("29/01/05") AS D1, CDate("01/29/05") AS D2
> и сравните результаты.

хм...выдал одинаковые даты


 
sniknik ©   (2005-02-03 18:18) [29]

> хм...выдал одинаковые даты
ну, и ты будеш им теперь доверять? ;о))

формат записи строкой должен быть изменен на ODBC ansi стандарт, тогда ошибку выдаст при неправильном вводе (чего ожидается по логике)
но тут случай то другой, данные то уже есть... и менять просто необходимо, а тогда уж сразу в дату.


 
Соловьев ©   (2005-02-03 18:22) [30]


>  менять просто необходимо, а тогда уж сразу в дату.

согласен. и как можно быстрее, пока неоднозначтости не появилось


 
Руслана   (2005-02-03 20:39) [31]

Уже все работает!!! ВСем спасибо большое за помощь!


 
Anatoly Podgoretsky ©   (2005-02-03 21:49) [32]

sniknik ©   (03.02.05 17:59) [27]
Это еще ничего, а вот 01/02/2005 пострашнее



Страницы: 1 вся ветка

Текущий архив: 2005.03.06;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.045 c
3-1107428125
DSKalugin
2005-02-03 13:55
2005.03.06
Advantage Database Server


4-1106394485
Islander
2005-01-22 14:48
2005.03.06
Как получить из системы названия кнопок Retry, Ignore, Cancel


1-1108741978
maxistent
2005-02-18 18:52
2005.03.06
Как соединить два кампутера...


1-1109094012
read_me
2005-02-22 20:40
2005.03.06
помогите пожалуйста разобраться и переделать


3-1107785308
Davinchi
2005-02-07 17:08
2005.03.06
Очистка и упаковка dbf