Форум: "Базы";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];
ВнизВопрос по 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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.031 c