Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2010, 08:30   #1
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию Неправильно работает запрос

Запрос
Код:
   DM.FIBDS.Close;
   DM.FIBDS.SQLs.SelectSQL.Text:='Select * FROM NEDVIGEMOST where ("ДАТА ИЗМЕНЕНИЯ"=:Data and "ВРЕМЯ ИЗМЕНЕНИЯ">:Tame)';
   DM.FIBDS.ParamByName('Data').Value:=DateToStr(Data);
   DM.FIBDS.ParamByName('Tame').Value:=TimeToStr(Vrem);
   dm.FIBDS.Open;
Результатом запроса является запись в которой дата равна указанной и время равно указанному. При этом в базе нет записей с временем больше указанного. Может я что то упускаю.
Поэтому на мой взгляд не должно быть вообще записей выбрано
Lokos вне форума Ответить с цитированием
Старый 14.12.2010, 08:48   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Что-то я ничего не понял... Можно на базу взглянуть?
Кстати переводить в строку совсем не нужно
Код:
with DM.FIBDS do begin
 Close;
 SQLs.SelectSQL.Text:='Select * FROM NEDVIGEMOST where ("ДАТА ИЗМЕНЕНИЯ"=:Data and "ВРЕМЯ ИЗМЕНЕНИЯ">:Tame)';
 ParamByName('Data').Value:=(Data);
 ParamByName('Tame').Value:=(Vrem);
 Open;
end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.12.2010, 08:58   #3
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию

как именно взглянуть?
Ну смотрите я понимаю этот запрос должне выводить все те записи в которых Дата изменения = параметру Data и Время изменения > параметра Tame. А на деле выводится запись в которой дата = Data и Время = Tame то есть условие работает не так как нужно как будто заместо and выполняется or
Lokos вне форума Ответить с цитированием
Старый 14.12.2010, 10:09   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

я думаю, что проблема в том, что в поле "ВРЕМЯ ИЗМЕНЕНИЯ" хранятся ещё и секунды (миллисекунды), которых Вы не видите по какой-то причине!
поэтому "ВРЕМЯ ИЗМЕНЕНИЯ" и оказывается БОЛЬШЕ, чем то время, которое Вы передаёте в запрос!

p.s. без примера в виде тестовой БД трудно сказать что-то конкретнее.
Но, я бы советовал искать не ошибку в работе SQL запроса, а в тех данных, которые в базе или в тех параметрах, которые Вы передаёте в запрос в качестве параметров.
Кстати, Виталий абсолютно прав - TimeToStr абсолютно не нужен. Более того, это может являться причиной "неправильной" работы запроса.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.12.2010, 10:16   #5
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию

насчет timetostr и в правду не нужно. нет выводил значения в мемо время имеет формат 7:06:22
а вот в базе если просматривать ее через IbExpert оно имеет вид 07:06:22.
А сама программа работает так 2 базы на данный момент с идентичными данными у клиента выбирается запись с максимальным значением даты и времени вот так
Код:
function GetData():TDate;
begin
  dm.FIBDS.Close ;
  dm.FIBDS.SQLs.SelectSQL.Text:=('select MAX(NEDVIGEMOST."ДАТА ИЗМЕНЕНИЯ") from NEDVIGEMOST ');
  dm.FIBDS.Open;
  GetData:=DM.FIBDS.Fields[0].AsDateTime;
end;
function GetVrem(Data:TDate):TTime;
begin
  dm.FIBDS.Close ;
  dm.FIBDS.SQLs.SelectSQL.Text:=('select MAX(NEDVIGEMOST."ВРЕМЯ ИЗМЕНЕНИЯ") from NEDVIGEMOST where "ДАТА ИЗМЕНЕНИЯ"=:Data');
  DM.FIBDS.ParamByName('Data').Value:=DaTeToStr(Data);
  dm.FIBDS.Open;
  GetVrem:=DM.FIBDS.Fields[0].AsDateTime;
end;
после чего время и дата передаются серверу у которого используется таже база с еще пока такими же значениями и результатом запроса является одна запись а должен являться 0

похоже проблема действительно с временем(((
У кого нибудь есть идеи? База используется FireBird поле Время изменениея имеет тип Time

при попытке вывести все это дело в которое выбирается в дбгрид я увидел следующее Время изменения 07:06

Последний раз редактировалось Stilet; 14.12.2010 в 13:30.
Lokos вне форума Ответить с цитированием
Старый 14.12.2010, 11:39   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) то, что Вы делаете двумя запросами в подавляющем большинстве СУБД можно сделать ОДНИМ запросом.

2) выкиньте напрочь DateToStr - он может только навредить. но никак не помочь!
Код:
вместо:
DM.FIBDS.ParamByName('Data').Value:=DaTeToStr(Data);
напишите
DM.FIBDS.ParamByName('Data').Value:=Data;
3) теоретически, в СУБД могуть быть функции, которые отбрасывают секунды, миллисекунды и прочая... проверьте... у Вас какая СУБД?
Во многих СУБД есть отдельные программы для управления данными - проверьте, что у Вас внутри таблиц творится (какие типы, какие даннные и прочая)

и последнее, можно добавить (если СУБД позволяет) в запрос условие, чтобы заданное вами время было не просто больше/или меньше, но чтобы оно отличалось более чем на какой-то интервал...
ну типа такого
select * from таблица where ДАтаИзменения = t and ВремяИзменения > :tm and (ВремяИзменения-:tm)>1
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.12.2010, 02:21   #7
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию

СУБД FireBird
Если просматривать таблицу при помощи IbExpert то время отображается в формате hh/mm/ss поле имеет тип time не каких дополнительных функций работающих с этим полем не писалось. Убрал DateToStr.
После некоторых манипуляций выяснил что в DBGrid время отображается hh/mm а если это поле вывести например в мемо то получаем время типа hh/mm/ss

удалось устранить ошибку так
при добовлении новой записи в таблицу указал формат
Код:
......
ParamByName('Tame').value:=FormateDateTime('hh/mm/ss',Time);
......
после чего запрос начал работать как надо до этого добавление происходило след образом
Код:
......
ParamByName('Tame').value:=Time;
......
И похоже действительно добавлялись милисекунды

Последний раз редактировалось Stilet; 15.12.2010 в 10:31.
Lokos вне форума Ответить с цитированием
Старый 15.12.2010, 06:49   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
И похоже действительно добавлялись милисекунды
добавлялись, добавлялись..


Цитата:
удалось устранить ошибку так
Ну, отлично. Подавить проблему в зародыше - это правильно.
можно, конечно, было побороться и с последствиями, но если есть возможность избежать "танцев с бубном" - почему бы этим не пользоваться?!

Поздравляю.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TextRect работает неправильно bbk_serg БД в Delphi 16 10.08.2010 21:11
неправильно работает сортировка Brabus Помощь студентам 1 30.05.2010 14:25
Неправильно работает WinExec? TwiX Общие вопросы Delphi 2 26.11.2009 21:07
Скрипт неправильно работает aleksa76 JavaScript, Ajax 4 21.05.2008 17:47
Запрос неправильно работает... yulia БД в Delphi 0 27.05.2007 20:41