| 
| 
 | Вопрос # 1 889/ вопрос решён / | 
 |  Приветствую, уважаемые эксперты!у меня такой вопрос : я с помощью SQL-запроса выбираю записи из таблицы . но у меня отображаються те данные которые не попали в концы отрезка отбора.
 А мне нужны данные с концами отрезка выборки.
 В чем ошибка в запросе?
 Приложение:Переключить в обычный режим vars1,s2:string;begins1:=floattostr(DateTimePicker1.DateTime);s2:=floattostr(DateTimePicker2.DateTime);if (RadioGroup1.ItemIndex=0) thenbeginForm7.ADOQuery1.Close;Form7.ADOQuery1.SQL.Clear;Form7.ADOQuery1.sql.Add('select
PorNomer,DataPost,StatusKol,fio,KemPereslano,Adress,Soderganie,Ispolnitel,Status,DataIspolnen from
Zurnal where DataPost >= '+s1+' and DataPost<= '+s2);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] [Следующая »]  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |