Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-6110
DelphiN!
2004-02-20 18:54
2004.03.03
Автозагрузка в WinXP


3-5995
Дина
2004-02-05 08:48
2004.03.03
Архивация базы данных


14-6235
raymond
2004-02-09 13:51
2004.03.03
Как подружить The Bat и прокси?


6-6171
NewD
2003-12-26 13:46
2004.03.03
Как переадресовать запрос на др. комп. в др. сети


1-6107
VID
2004-02-16 01:18
2004.03.03
Программно нажать на ссылку





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский