Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

DNK
I. DNK
Баллы: 5

Подробнее »



Вопрос # 1 889

/ вопрос решён /

Приветствую, уважаемые эксперты!
у меня такой вопрос : я с помощью SQL-запроса выбираю записи из таблицы . но у меня отображаються те данные которые не попали в концы отрезка отбора.
А мне нужны данные с концами отрезка выборки.
В чем ошибка в запросе?

Приложение:
  1. var
  2. s1,s2:string;
  3. begin
  4. s1:=floattostr(DateTimePicker1.DateTime);
  5. s2:=floattostr(DateTimePicker2.DateTime);
  6. if (RadioGroup1.ItemIndex=0) then
  7. begin
  8. Form7.ADOQuery1.Close;
  9. Form7.ADOQuery1.SQL.Clear;
  10. Form7.ADOQuery1.sql.Add('select PorNomer,DataPost,StatusKol,fio,KemPereslano,Adress,Soderganie,Ispolnitel,Status,DataIspolnen from Zurnal where DataPost >= '+s1+' and DataPost<= '+s2);
  11. Form7.ADOQuery1.Open;


Танюшка Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задала: Танюшка (статус: Посетитель)
Вопрос отправлен: 9 сентября 2008, 17:22
Состояние вопроса: решён, ответов: 3.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Танюшка!
попробуем визуализировать запрос. например, у нас есть десять записей с датами от 1 до 10 (чисто условные абстрактные даты). и хочеться отобрать концы с 3 до 7. Ваш запрос выдаст даты 3 4 5 6 7, а Вы хотите 1 2 3 7 8 9 10. Да?
Тогда условие надо переписать где то так.
where DataPost <= '+s1+' or DataPost>= '+s2
Если я всё таки не угадал:), то приведите, какую последовательность Вы хотите.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 9 сентября 2008, 17:37
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: Мережников Андрей

Здравствуйте, Танюшка!
Думаю, что проблема у Вас не в запросе, а в строках s1:=floattostr(DateTimePicker1.DateTime);
s2:=floattostr(DateTimePicker2.DateTime);
Проверьте свойство time у компонентов DateTimePicker - наверняка у Вас там стоят отличные от 0 значения, в этом вся проблема.

Ответ отправил: Мережников Андрей (статус: Абитуриент)
Время отправки: 9 сентября 2008, 18:07
Оценка за ответ: 5

Ответ #3. Отвечает эксперт: Шичко Игорь

Здравствуйте, Танюшка!
Согласен с предыдущими отвечающими. Скорее всего DateTimePicker1.DateTime у Вас дробное число.
Я бы предложил попробовать выделить из него целую дату:
Для этого использовать:
s1:=floattostr(DateOf(DateTimePicker1.DateTime));
s2:=floattostr(DateOf(DateTimePicker2.DateTime));
Только перед использованием необходимо в раздел uses подключить модуль DateUtils.
Тогда у Вас будет происходить отбор по датам (без учета дробной части).

Ответ отправил: Шичко Игорь (статус: 9-ый класс)
Время отправки: 10 сентября 2008, 07:57
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 27; последнее сообщение — 10 сентября 2008, 17:22; участников в обсуждении: 4.

Страницы: [1] [2] [Следующая »]

Танюшка

Танюшка (статус: Посетитель), 9 сентября 2008, 17:43 [#1]:

вообщето мой запрос должен был выдавать первую последовательность т.е. 3 4 5 6 7. но он выдает 4 5 6 7 это в вашей интерпретации
Вадим К

Вадим К (статус: Академик), 9 сентября 2008, 17:53 [#2]:

а дата 3 случайно не совпадает с датой, заданной s1?
Галочка "подтверждения прочтения" - вселенское зло.
Танюшка

Танюшка (статус: Посетитель), 9 сентября 2008, 17:58 [#3]:

так она вроде и должна ... или нет????
т.е. выбор допустим масив DataPost={1 2 3 4 5 6 7 8 9 10}
s1 =3
s2=7
при моем запросе
where DataPost >= '+s1+' and DataPost<= '+s2
в результате должно быть массив {3 4 5 6 7}
а у меня получаеться {4 5 6 7 } вот я и не пойму почему.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 9 сентября 2008, 18:00 [#4]:

Вам нужно сравнивать только по дате или по дате-времени? Что у Вас хранится в DataPost?
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 9 сентября 2008, 18:01 [#5]:

И зачем Вы применяете floattoStr для даты?
Вадим К

Вадим К (статус: Академик), 9 сентября 2008, 18:06 [#6]:

дата - вещественное число. Но в базе дата может быть записана в виде как дата с временем, где время нулевое, так и дата просто дата.
Надо внимательно посмотреть, что передаётся в качестве начальной даты. Вполне возможно, что там дробная часть (которая отвечает за время) ненулевая и соответственно, оно будет всегда больше за то, что в базе.
Минимально, что можно сделать - немножко уменьшить дату перед сравнением.
Галочка "подтверждения прочтения" - вселенское зло.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 9 сентября 2008, 18:11 [#7]:

Зачем изменять дату? Надо просто обнулить дробную часть вещественного числа, которое получается при преобразовании даты. Либо, что гораздо проще, обнулить значение свойства time у компонентов DataTimePicker
Вадим К

Вадим К (статус: Академик), 9 сентября 2008, 18:21 [#8]:

дата - вещественное число. а сравнивать два вещественных числа на равенство - нельзя. Именно по этому и используют вместо выражения x1 = x2 выражение вида abs(x1-x2) < eps, где eps - достаточно маленькое числа. В данном контексте это может быть полсекунды.
Галочка "подтверждения прочтения" - вселенское зло.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 9 сентября 2008, 18:31 [#9]:

to Вадим К
Для даты-времени можно. Т.к. она храниться как дробное число с фиксированной точностью ( с фиксированным числом знаков в дробной части), а это не то же самое, что Вы имеете в виду. А в целом, для вещественных чисел, Вы правы.
Вадим К

Вадим К (статус: Академик), 9 сентября 2008, 18:37 [#10]:

Как именно храниться дата в каждом конкретном движке БД - проблемы движка. Они гарантируют, что будут делать правильное сравнение, если дата-время задано в явном виде (то есть 21/12/2000 и подобном). А в случае хака, как здесь, никто ничего не гарантирует. Движок БД вправе хранить дату как он считает правильным, даже хоть строкой или в виде кол-ва секунд от какой то примечательной даты.
Галочка "подтверждения прочтения" - вселенское зло.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 9 сентября 2008, 18:53 [#11]:

хранить то, конечно можно хоть в миллисекундах, только существует стандарт ANSI SQL, в котором четко прописано, как должна храниться дата-время. А все производители движков БД стремятся как можно точнее учитывать стандарт в обязательной части, чтобы их продукты покупались.
Кроме того и в Delphi дата-время храниться как вещественное число с фиксированной дробной частью: в целой части храниться дата, в дробной время. Дата определяется как количество суток, прошедших с 0 часов 30.12.1899, а время - как часть суток, прошедших с 0 часов.
Вадим К

Вадим К (статус: Академик), 9 сентября 2008, 19:04 [#12]:

Всё это я знаю. Но Вы просто не сталкивались с подобными проблемами.
Галочка "подтверждения прочтения" - вселенское зло.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 9 сентября 2008, 19:17 [#13]:

to Вадим К
Если Вы о проблемах, с датой-временем, то Вы правы - я не использую методы, которые могут привести к таким проблемам. Для работы с датой-временем я использую функции и методы, которые для этого предназначены. А не искать ошибки, возникающие из-за неверного преобразования типов.
Вадим К

Вадим К (статус: Академик), 10 сентября 2008, 10:59 [#14]:

Вот так всегда, разберёшь по полочкам человеку проблему, другие на этих ответах предложат то,что ты сказал, получат пару балов. А ты сидишь с ничем.... Абсолютно пропадает желание отвечать.
Галочка "подтверждения прочтения" - вселенское зло.
Танюшка

Танюшка (статус: Посетитель), 10 сентября 2008, 11:05 [#15]:

Извините просто не успела всем отправить оценки!!!!
На самом деле вы были правы ... ошибка была в неверной конвертации даты в число .!!! С вашей помощью разобралась . Спасибо!!!!!
Шичко Игорь

Шичко Игорь (статус: 9-ый класс), 10 сентября 2008, 11:22 [#16]:

to Вадим К
Если последнее сообщение в мой адрес, то хотелось бы обратить внимание, что никого из предыдущих я не скопировал, а предложил свою реализацию. Плагиатом не занимаюсь и не планирую заниматься.
Вадим К

Вадим К (статус: Академик), 10 сентября 2008, 11:37 [#17]:

Да не обвиняю Вас, но если посмотреть на ответ - то это просто вывод с всего, что я и Мережников Андрей писали.
Галочка "подтверждения прочтения" - вселенское зло.
Шичко Игорь

Шичко Игорь (статус: 9-ый класс), 10 сентября 2008, 11:48 [#18]:

Может быть.
Несмотря на это, конкретной реализации никто не предложил, поэтому считаю свои баллы все-таки набрал заслуженно.
Ведь можно сколько угодно обсуждать вопросы даты и времени.
Предлагаю завершить обсуждение мирным соглашением: каждый из нас внес посильную лепту в помощь человеку.
Вадим К

Вадим К (статус: Академик), 10 сентября 2008, 11:59 [#19]:

Эксперт это не человек, который всё знает, а тот, кто может преподнести ответ так, что бы его понял вопрошающий.
Галочка "подтверждения прочтения" - вселенское зло.
Шичко Игорь

Шичко Игорь (статус: 9-ый класс), 10 сентября 2008, 12:12 [#20]:

Вадим, мы углубляемся в философию.
Я бы преобразовал формулу эксперта немного в другой вид:
Эксперт - человек, который много знает (но не все) и может преломить свои знания под конкретную задачу, поставленную пользователем.

Страницы: [1] [2] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 24 августа 2017, 02:08
Выполнено за 0.08 сек.
Рейтинг@Mail.ru