Главная страница
    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.006 c
14-6224
Rusta
2004-02-09 17:31
2004.03.03
Какой язык программирования выбрать для изучения?


3-5975
Gumbert-Gumbert
2004-02-04 15:55
2004.03.03
Как сделать таблицу с такими же полями какие возвращает SQL запро


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


1-6044
Случайно забежавший
2004-02-21 12:55
2004.03.03
StringGrid и OnKeyPress


14-6214
*BES*
2004-02-10 13:23
2004.03.03
Читаем txt файл из exe!!!





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский