Форум: "Базы";
Текущий архив: 2004.03.03;
Скачать: [xml.tar.bz2];
ВнизВыборка из DBF Найти похожие ветки
← →
lightix (2004-02-05 13:03) [0]Имеется таблица DBase, следующей структуры:
DATA1 Char(10),
TIME1 Char(8),
EVNT1 Char(20)
Можно ли выбрать из нее все записи, у которых дата+время >= указанного через параметр?
Или же прийдется выбирать все записи в таблице и тупо сравнивать?
В Oracle например я бы сделал преобразование с помощью функции TO_DATE в тип данных datetime и спокойно написал бы сравнение в фразе WHERE.
Как это сделать в BDE?
← →
Sandman25 (2004-02-05 13:08) [1]В DBF нет типа date или time?
Через CAST(datefield as datetime)+CAST(timefiled as datetime) не пробовали?
← →
lightix (2004-02-05 13:36) [2]Написал вот так
select ev.* from "eventlog.dbf" ev
where cast(ev.dt as date)>=:dat and
cast(ev.tm as time)>=:tim
и передал параметры
Query_Copy.Close();
Query_Copy.ParamByName("dat").Value:=StrToDate("05.02.2004");
Query_Copy.ParamByName("dat").Value:=StrToTime("12:00:00");
Query_Copy.Open();
Ничего не выбирает, хотя записи с датой 05.02.2004 и временем больше 12:00 есть...
← →
Sandman25 (2004-02-05 13:41) [3]cast(ev.dt as date)>=:dat and
cast(ev.tm as time)>=:tim
Это неправильное условие.
Ведь если дата больше, то время уже не важно.
(cast(ev.dt as date)>:dat1 or
cast(ev.dt as date)=:dat2 and cast(ev.tm as time)>=:tim)
dat1=dat2, конечно.
StrToDate("05.02.2004") - это подозрительно. Используйте лучше DateTimePicker1.Date
← →
Anatoly Podgoretsky (2004-02-05 13:48) [4]Sandman25 © (05.02.04 13:08) [1]
Есть, первый с 83 года, второй начиная с dBase7
← →
lightix (2004-02-05 15:03) [5]Sandman25 © (05.02.04 13:41) [3]
И с таким кодом тоже не выбирает ничего :(
← →
Sandman25 (2004-02-05 15:30) [6][4] Anatoly Podgoretsky © (05.02.04 13:48)
Понятно. Тогда автору лучше переделать структуру БД.
← →
lightix (2004-02-05 15:37) [7]да неохота переделывать - програмка готовая рабочая, писалась года 2 назад... а сейчас нужно добавить в нее одну небольшую сервисную функцию ...
Кстати, убрал из WHERE время, оставил только дату - выбирает!
Непонятно почему он не хочет время стыковать.
Может тип параметра сделать другой, не время а скажем строку, и в запросе параметр тоже CASTовать?
← →
Sandman25 (2004-02-05 15:53) [8]А в поле времени оно записано с двоеточием? Проверьте, что возвращает cast(tm as time)
← →
lightix (2004-02-05 16:06) [9]Заработало но как-то странно.
Запрос такой:
select ev.* from "eventlog.dbf" ev
where (cast(ev.dt as date)>cast(:dt as date) or
(cast(ev.dt as date)=cast(:dt as date) and cast(ev.tm as time)>=cast(:tm as time)))
Проблема в том что если указать параметром время 12:00:00 (или даже 12:30:00) то выбирает все из таблицы по указанной дате, несмотря на время, а если скажем указать время 13:00:00 или либое другое отличное от 12 - то работает нормально.
В чем может быть проблема?
← →
Sandman25 (2004-02-05 16:09) [10]А какое время есть в базе за указанную дату?
Если времена в диапазоне 12:30:01-12:59:59, то так и надо :)
← →
lightix (2004-02-05 16:13) [11]Нет, выбирает и 11:00 и т.п.
Вот, заметил еще если написать 12:00:00pm то выбирает как надо - видать тут нужно указать что время в 24-часовом формате...
Как ему это сказать?
← →
lightix (2004-02-05 16:16) [12]Вот написал 12:00:00ampm и работает :)))) Чудеса!
← →
Sandman25 (2004-02-05 16:18) [13]Как ему это сказать?
В настройке BDE попробуйте.
← →
lightix (2004-02-05 16:20) [14]Блин, теперь при 11:00:00ampm думает что это 23:00 ...
Как ему сказать формат?
← →
Sandman25 (2004-02-05 16:23) [15]BDE/Configuration/System/Formats/Time/TWELVEHOUR = false
← →
lightix (2004-02-05 16:24) [16]А в программе можно задать формат для БДЕ?
Чтоб не задавать его на каждой машине где используется программа.. или проще самому переводить время в 12-часовое?
← →
Sandman25 (2004-02-05 16:25) [17]Посмотрите методы TSession. Если можно, то должно быть там ИМХО
← →
lightix (2004-02-05 16:29) [18]Ок, спасибо Вам огромное за помощь!
← →
Sandman25 (2004-02-05 16:34) [19]Да какая там помощь. Вы сами все нашли. Но все равно спасибо за добрые слова :)
← →
Sandman25 (2004-02-05 16:37) [20]Посмотрите dbiSetTimeFormat. Похоже на то, что нужно
← →
lightix (2004-02-05 17:23) [21]Решил не мучаться и сделал так
DecodeTime(NowTime, Hour, Min, Sec, MSec);
if Hour<12 then
ampm:="am"
else
ampm:="pm";
Query_Copy.Close();
Query_Copy.ParamByName("dt").Value:=DateToStr(NowTime);
Query_Copy.ParamByName("tm").Value:=TimeToStr(NowTime)+ampm;
Query_Copy.Open();
Теперь все класно работает :))
← →
Sandman25 (2004-02-05 17:30) [22]Понятно. Выкрутились, значит :)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.03.03;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.027 c