![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Выборка из DBF
lightix © (2004-02-05 13:03:00)
Имеется таблица DBase, следующей структуры:
DATA1 Char(10),
TIME1 Char(8),
EVNT1 Char(20)
Можно ли выбрать из нее все записи, у которых дата+время >= указанного через параметр?
Или же прийдется выбирать все записи в таблице и тупо сравнивать?
В Oracle например я бы сделал преобразование с помощью функции TO_DATE в тип данных datetime и спокойно написал бы сравнение в фразе WHERE.
Как это сделать в BDE?
Sandman25 (2004-02-05 17:30:00) [1]
Понятно. Выкрутились, значит :)
lightix (2004-02-05 17:23:00) [2]
Решил не мучаться и сделал так
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 16:37:00) [3]
Посмотрите dbiSetTimeFormat. Похоже на то, что нужно
Sandman25 (2004-02-05 16:34:00) [4]
Да какая там помощь. Вы сами все нашли. Но все равно спасибо за добрые слова :)
lightix (2004-02-05 16:29:00) [5]
Ок, спасибо Вам огромное за помощь!
Sandman25 (2004-02-05 16:25:00) [6]
Посмотрите методы TSession. Если можно, то должно быть там ИМХО
lightix (2004-02-05 16:24:00) [7]
А в программе можно задать формат для БДЕ?
Чтоб не задавать его на каждой машине где используется программа.. или проще самому переводить время в 12-часовое?
Sandman25 (2004-02-05 16:23:00) [8]
BDE/Configuration/System/Formats/Time/TWELVEHOUR = false
lightix (2004-02-05 16:20:00) [9]
Блин, теперь при 11:00:00ampm думает что это 23:00 ...
Как ему сказать формат?
Sandman25 (2004-02-05 16:18:00) [10]
Как ему это сказать?
В настройке BDE попробуйте.
lightix (2004-02-05 16:16:00) [11]
Вот написал 12:00:00ampm и работает :)))) Чудеса!
lightix (2004-02-05 16:13:00) [12]
Нет, выбирает и 11:00 и т.п.
Вот, заметил еще если написать 12:00:00pm то выбирает как надо - видать тут нужно указать что время в 24-часовом формате...
Как ему это сказать?
Sandman25 (2004-02-05 16:09:00) [13]
А какое время есть в базе за указанную дату?
Если времена в диапазоне 12:30:01-12:59:59, то так и надо :)
lightix (2004-02-05 16:06:00) [14]
Заработало но как-то странно.
Запрос такой:
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 15:53:00) [15]
А в поле времени оно записано с двоеточием? Проверьте, что возвращает cast(tm as time)
lightix (2004-02-05 15:37:00) [16]
да неохота переделывать - програмка готовая рабочая, писалась года 2 назад... а сейчас нужно добавить в нее одну небольшую сервисную функцию ...
Кстати, убрал из WHERE время, оставил только дату - выбирает!
Непонятно почему он не хочет время стыковать.
Может тип параметра сделать другой, не время а скажем строку, и в запросе параметр тоже CASTовать?
Sandman25 (2004-02-05 15:30:00) [17]
[4] Anatoly Podgoretsky © (05.02.04 13:48)
Понятно. Тогда автору лучше переделать структуру БД.
lightix (2004-02-05 15:03:00) [18]
Sandman25 © (05.02.04 13:41) [3]
И с таким кодом тоже не выбирает ничего :(
Anatoly Podgoretsky (2004-02-05 13:48:00) [19]
Sandman25 © (05.02.04 13:08) [1]
Есть, первый с 83 года, второй начиная с dBase7
Sandman25 (2004-02-05 13:41:00) [20]
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