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

Вниз

Выборка из 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.017 c
6-6166
$hade
2003-12-26 13:44
2004.03.03
Авторизация на прокси сервере...


1-6117
Dima Los
2004-02-20 17:08
2004.03.03
Стандартный вид формы заменить своей картинкой


3-5963
Fom
2004-02-05 16:32
2004.03.03
Стоит ли чистить домены?


3-5977
TurburatoR
2004-02-05 11:41
2004.03.03
Локальная таблица


14-6240
ИМХО
2004-02-10 19:37
2004.03.03
Собираю...