Форум: "Базы";
Текущий архив: 2002.12.23;
Скачать: [xml.tar.bz2];
ВнизПоле Найти похожие ветки
← →
Shved (2002-12-02 13:12) [0]Имеется таблица. Формирую SQL, чтобы произошла выборка интервала времени, в таком виде:
FirstDay:=Edit1.Text;
SecondDay:=Edit2.Text;
Form1.Query.Close;
Form1.Query.SQL.Clear;
Form1.Query.SQL.Add("select *");
Form1.Query.SQL.Add("FROM "BDAuto.DB" Bdauto");
Form1.Query.SQL.Add("WHERE "DAY" BETWEEN "+FirstDay+" and "+SecondDay);
Form1.Query.Open;
Form1.DBGrid1.DataSource:=Form1.DataSource2;
FirstDay и SecondDay в виде ДД.ММ.ГГ (текст), но при запуске программы вылезает ошибка "Invalid use of keyword "02"" (это год).
Что я не так делаю?
И вообще, в Delphi можно поставить полю атрибут D или @. Оба имеют формат даты, но чем они различаются (только временем?) и почемуо в примерах Delphi используется только формат "@"?
Вобщем, какой формат посоветуете. господа профессионалы и какой формат запроса должен быть?
← →
Max Zyuzin (2002-12-02 13:20) [1]Значения надо взять в кавычки... в твоем случае это выглядит так...
Form1.Query.SQL.Add("WHERE "DAY" BETWEEN """+FirstDay+""" and """+SecondDay+""");
Это все одинарные кавычки... но ИМХО лучше сделать так...
Form1.Query.Close;
Form1.Query.SQL.Clear;
Form1.Query.SQL.Add("select *");
Form1.Query.SQL.Add("FROM "BDAuto.DB" Bdauto");
Form1.Query.SQL.Add("WHERE "DAY" BETWEEN :FirstDay and :SecondDay");
try
Query.ParamByName("FirstDay").AsDate := StrToDate(FirstDay);
Query.ParamByName("SecondDay").AsDate := StrToDate(SecondDay);
except
/// Хреновая дата....
end;
Form1.Query.Open;
← →
ЮЮ (2002-12-02 13:21) [2]Если пихать дату непосредственно в запрос, то, ао синтаксису, она должна быть обрамлена кавычками. А чтобы не зависеть от формата даты, лучше использовать в запросе параметры
← →
Shved (2002-12-02 14:15) [3]Спасибо. А по поводу форматов "D" и "@" что скажете? Что лучше и почему?
← →
Shved (2002-12-02 14:32) [4]А тот код, что вы предложили - не работает. Пишет, что неправильный формат даты. Какой формат должен быть, если атрибут поля "D", а формат записей в поле DD.MM.YY?
← →
Max Zyuzin (2002-12-02 14:34) [5]Ну вообще то, формат должен быть такой как в системе...
← →
Shved (2002-12-02 14:40) [6]Все равно не помогает. Присваивал переменным FirstDay и SecondDay разные значения: DD.MM.YY, DD.MM.YYYY, DD.MM. Ошибка всегда одна и та же. В системе стоит формат DD.MM.YY.
Может быть, есть другой способ выборки по дате? Если у кого есть - киньте кусок кода, пожалуйста. Ну а если нет, то хоть подсоветуйте...
← →
Max Zyuzin (2002-12-02 14:48) [7]А где именно выдает ошибку???
Query.ParamByName("FirstDay").AsDate := StrToDate(FirstDay);
Здесь?
← →
Shved (2002-12-02 15:16) [8]Ошибка в выполнении SQL (перескакивает на следующую процедуру). Пишет "Type mismatch in expression". Я так понимаю, что он не хочет переводить данные из Edit1 и Edit2 в формат даты. Я ввожу примерно так: "03.12.02" и "05.12.02". Формат такой же, как в системе, разделитель точками... Уже руки опускаются даже... Что это за беда такая?
← →
Max Zyuzin (2002-12-02 16:19) [9]Давайте по порядку... пожалуйста привели полность текст запроса, которй хочешь выполнить... и типы полей.
А пробовал ли ты это дело выполнить просто в IBExpert?
← →
Anatoly Podgoretsky (2002-12-02 18:25) [10]Max Zyuzin © (02.12.02 14:34)
Если для ИБ то это не так, ему будет наплевать на формат системы, для Парадокса другое дело
← →
Max Zyuzin (2002-12-02 18:37) [11]Anatoly Podgoretsky © (02.12.02 18:25)
Ну вроде как в IB по умолчанию стоит DD.MM.YYYY ??
← →
Anatoly Podgoretsky (2002-12-02 18:42) [12]Может быть, не знаю, но настройки то клиентского компьютера тут явно не причем, другое дело с параметрами.
← →
Shved (2002-12-02 19:17) [13]Текст запроса я привел выше. FirstDay и SecondDay читаются из Edit1 и Edit2 соответственно. Запрос отправляется в TQuery, который привязан к DGrid.
Я вот еще посмотрел в SQL-editor"e автоматически изменяется строка запроса типа "02.12.02" на "12/02/2002". Отсюда, может быть формат даты и нужно писать какк-то так? Но опять же, ошибка...
Что вам еще нужно знать для точного ответа на мой вопрос?
← →
Max Zyuzin (2002-12-02 19:22) [14]>Anatoly Podgoretsky © (02.12.02 18:42)
Хотя, с другой стороны - какая разница какой формат даты у IB??
Я ведь работу с датай заканчиваю на клиенте, где ее из текста преобразую в дату, а она уже везде одинаковая....
Совет Shved © - забудь про ввод даты в Edit и пользуйся DateTimePicker-ом... тогда все будет проще..., и НАМНОГО удобнее для пользователя....
Query.ParamByName("FirstDay").AsDateTime := DateTimePicker1.DateTime;
← →
Max Zyuzin (2002-12-02 19:25) [15]>Shved © (02.12.02 19:17)
Так... давай определимся какая у нас СУБД... Ibase или Paradox?
А если у тебя автоматчески переводится, может попробовать вводить дату в таком же формате? Хотя лучше пользоваться DateTimePicker-ом
← →
Shved (2002-12-02 20:24) [16]База Paradox. Delphi 5.
А ни у кого нет готового куска кода с выборкой по дате на Paradox? Буду очень признателен.
← →
Max Zyuzin (2002-12-02 21:58) [17]>Shved © (02.12.02 20:24)
А ОС какая? Случаем не Win2k англ.?
Попробуй ради эксперимента сделать такую хрень...
Caption := DateToStr(Now);
И посмотри что получится... это у тебя и будет формат данных в системе... что что мне говорит, что будет что нить вроде 02/12/2002
С такой шуткой я уже сталкивался. Не смотря на то, что у тебя в панели управления написано что фомат через точки... Лечилось это установкой региональных сеттингов сначала в англ., а потом назад в русский.
А куска кода с собой нету :( только завтра... если не забуду :)
← →
Shved (2002-12-02 22:06) [18]Ось там Win98. Но надо будет делать с учетом переноса в сеть, а в сети почти все компы под Win2000, так что все равно надо учесть.
Проверить сейчас не могу, т.к. все на работе, так что только завтра. А за код заранее спасибо.
← →
Max Zyuzin (2002-12-02 22:08) [19]Тады одназначно попробуй DateTimePicker, он уже возвращяет значение типа TDateTime и не надо заморачивать голову... как преобразовать строку в дату...
← →
LSW (2002-12-03 08:57) [20]Попробуй сделать рестуктуризацию таблицы и поле DAY измени на поле, к примеру DAY_1 и попробуй все выше сказанное.
← →
DN (2002-12-03 11:20) [21]Можно попробовать и без SQL:
(поле в базе в формате DATA, для ввода используется MaskEdit)
...
if MaskEdit1.Enabled = True then
begin
if MaskEdit1.Text<>" . . " then
begin
Table1.IndexFieldNames:="DateNPA";
Table1.FindKey([StrToDate(MaskEdit1.Text)]);
end
else
if MaskEdit1.Text =" . . " then
ShowMessage("Отсутствуют данные для поиска.");
end;
...
Что-то вроде этого.
← →
Mirolex (2002-12-03 15:03) [22]Для Paradox это известестная фигня при работе с датами.
Для начала, возьми любую программу, которая может выполнять SQL запросы (SQL Explorer из Delphi или Access хотя бы) и напиши этот запрос руками. И поиграй с форматами дат. Когда запрос заработает, тогда и думай как и какие параметры подставлять.
У меня сейчас нет времени, беге на работу, но можешь прислать мне email, а я посмотрю в исходниках (у меня точно есть такие запросы в старых программах).
← →
Shved (2002-12-03 15:40) [23]Вобщем, бросил я этой ерундой маяться и использовал DateTimePicker. Однако, вопрос все-таки остается актуальным, раз он такой резонанс вызвал. Так что, все-таки интересно как сделать все "по-правильному".
← →
Max Zyuzin (2002-12-03 15:51) [24]>Shved © (03.12.02 15:40)
Ты пробовал тот пример что я написал вчера???
Caption := DateToStr(Now);
← →
ShuraGrp (2002-12-03 16:12) [25]Form1.Query.SQL.Add("WHERE "DAY" BETWEEN cast("""+:FirstDay+""" as Date) and cast("""+:SecondDay+""" as Date)");
или
WHERE "DAY" BETWEEN cast(:FirstDay as Date) and cast(:SecondDay as Date)
← →
Shved (2002-12-03 17:21) [26]To Max Zyuzin
Пробовал. Не получилось :)
To ShuraGrp
Надо попробовать. Завтра скажу чего получилось.
← →
Max Zyuzin (2002-12-03 17:47) [27]ЭЭЭэ а что не получилось :) ??
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.12.23;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.01 c