|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Грабли с типом 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
|
||||
|
||||
Ага, примерно тоже самое было. Записать в базу можно только используя AsDateTime, ну я с DateTimePicker и брал DateTime, думаю все равно в таблице тип строго DATE. Ан нет- не пролезло )))
|
#3
|
||||
|
||||
Страдалецъ, это не грабли, а незнание предметной области.
Либо записывай Trunc(TDate), либо StartOfTheDay(TDate) и будет тебе счастье. Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#4
|
|||
|
|||
По мне, так лучше с датами сравнения проводить только диапозонами (>= .. <=), и всегда помнить, что нет типа 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 '}'*) ... |