Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.05.2010, 17:34
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию Грабли с типом TDate

В общем решил поделится историей, как я наступил на грабли.
Есть у меня программа написанная в Дельфи которая подключается к Акцесовской БД. Вплоть до 01.05.2010 года программа работала безупречно, а вот первого мая она начала чудить. В программе активно используются операции сравнения дат. Сравнивается дата возвращаемая функцией Date с полем из БД аналогичного типа TDate. Вот тут, как оказалось и можно закопать злую собаку. Итак просматриваю код программы в отладчике и отладчик мне выдает 01.05.2010 <> 01.05.2010.
Не равно и все, хоть ты тресни. После долгих танцев с бубном выявилась удивительная вещь, оказывается несмотря на то, что Дельфи заявляет что тип TDate используется для хранения даты, на самом деле он хранит еще и время, но при этом отказывается показывать это самое время в числе. Если вам Дельфи говорит, что значение типа TDate = 14566, то это не так, на самом деле там может быть 14566,11 или 14566,67. И естественно сравнение этих чисел не даст равенства. Дальнейшие изыскания показали, что я в программе случайно записывал данные в поле TDate как TDateTime и в итоге благополучно наступил на грабли.
Вывод - осторожно обращайтесь с типом TDate - проверить, что в переменную этого типа на самом деле записывается, увидеть в отладчике не получится.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 25.05.2010 в 17:45.
Ответить с цитированием
  #2  
Старый 26.05.2010, 13:17
Аватар для TOJluK
TOJluK TOJluK вне форума
Местный
 
Регистрация: 25.02.2009
Адрес: Минск
Сообщения: 551
Версия Delphi: 2007
Репутация: 110
По умолчанию

Ага, примерно тоже самое было. Записать в базу можно только используя AsDateTime, ну я с DateTimePicker и брал DateTime, думаю все равно в таблице тип строго DATE. Ан нет- не пролезло )))
Ответить с цитированием
  #3  
Старый 26.05.2010, 15:11
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Страдалецъ, это не грабли, а незнание предметной области.
Либо записывай Trunc(TDate), либо StartOfTheDay(TDate) и будет тебе счастье.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #4  
Старый 27.05.2010, 00:47
Asinkrit Asinkrit вне форума
Местный
 
Регистрация: 29.10.2009
Сообщения: 446
Репутация: 271
По умолчанию

По мне, так лучше с датами сравнения проводить только диапозонами (>= .. <=), и всегда помнить, что нет типа TDate и TTime, а есть тип TDateTime;
Вырезка из юнита Controls:
Код:
...
  TDate = type TDateTime;

  TTime = type TDateTime;

  {$EXTERNALSYM TDate}
  {$EXTERNALSYM TTime}
  (*$HPPEMIT 'namespace Controls'*)
  (*$HPPEMIT '{'*)
  (*$HPPEMIT '    typedef System::TDateTime TDate;'*)
  (*$HPPEMIT '    typedef System::TDateTime TTime;'*)
  (*$HPPEMIT '}'*)
...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:36.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter