Additional
dbCAP
AnyDAC
ThinDAC
NCOCI8
Topic: SEC_TO_TIME
SEC_TO_TIME
Posted: 2007/09/09 07:35
 
Добрый день.

AnyDac(последний) в Delphi2007 ругается на запрос к MySQL 5.17

SELECT SEC_TO_TIME( TIME_TO_SEC( CURTIME( ) ) - TIME_TO_SEC( postavshik.deadline_budni ) ) AS deadline3
FROM postavshik
LIMIT 0 , 30


а именно на SEC_TO_TIME , причем код заведомо правильный и работает в PHPMyAdmin

Ошибку находит в daADPhusMySQL в строке 1409
PLongint(ADestData)^ := ADDateTime2Time(EncodeTime(wHour, wMin, wSec, 0));

Что делать?

Upd: то жес самое происходит и для TIMEDIFF(CURTIME(),postavshik.deadline_budni) as deadline3

Post edited by: nikita, at: 2007/09/09 07:49
Re:SEC_TO_TIME
Posted: 2007/09/09 08:27
 
Привет

1) Какого типа deadline_budni ?
2) Точный текст ошибки ?

Удачи,
Дмитрий
Re:SEC_TO_TIME
Posted: 2007/09/10 01:55
 
Добрый день.

поле:
CREATE TABLE `postavshik` (
.....
`deadline_budni` time NOT NULL,
.....
)

ошибка: Unvalid argument to time encode.

скриншоты прилагаю

как я понял: вместо того, что бы отправить скрипт в сервер БД на исполнение, компанента сама пытается зачем то преобразовывать типы.

// Никита
File Attachment:
File name: 1.zip
File size:33868 bytes


Post edited by: nikita, at: 2007/09/10 01:56
Re:SEC_TO_TIME
Posted: 2007/09/10 07:21
 
Привет

1) У меня не получается воспроизвести проблему - все работает. Может быть уже исправлено в 2.0 коде.
2) Вы можете определить какое значение у переменной ASrcData перед исполнением строки 1409 (вы писали в первом посте) ?

Удачи,
Дмитрий
Re:SEC_TO_TIME
Posted: 2007/09/12 09:10
 
Привет.

ADestData $1027070


Сегодня нашел зависимость - если
переставить местами
TIME_TO_SEC( postavshik.deadline_budni )
и
TIME_TO_SEC( CURTIME( ) )

то в случае положительного значения вычитания ошибка не выскакивает, а выскакивает, если отрицательное!

(хотя конечно обязано работать и при положительном и при отрицательном значении)

// Никита


UPD: Я понял ! Он с ума сходит , когда из MySQL возвращается значение времени отрицательное!!

результаты из PHPMyAdmin:

deadline
-01:08:21
-00:24:21
-01:58:21
-03:58:21
....

Post edited by: nikita, at: 2007/09/12 09:12
Re:SEC_TO_TIME
Posted: 2007/09/12 23:31
 
Ясно, разобрался. Короче:
- Delphi не поддерживает отрицательные значения времени. Если посмотреть как хранится время, то используются беззнаковые целые.
- AnyDAC не ожидал таких значений

Я поправил AnyDAC, что бы он не ругался и доносил значение с минусом до програмиста. Но DBGrid, DBEdit и т.д. будут отображать значение без минуса, но с правильной абсолютной величиной. ADExecutor же будет выводить время с минусом.

Изменения войдут в 2.0. Что бы AnyDAC не ругался, откройте daADPhysMySQL, найдите метод TADPhysMySQLCommand.MySQL2DataValue и там замените dtTime case на:


 var   lNegBoolean; ....   dtTime:     begin       if ASrcData^ = '-' then begin         lNeg := True;         Inc(ASrcData);       end       else         lNeg := False;       ADStr2Int(ASrcData,     2, @wHourSizeOf(Word), True);       ADStr2Int(ASrcData 32, @wMinSizeOf(Word), True);       ADStr2Int(ASrcData 62, @wSecSizeOf(Word), True);       PLongint(ADestData)^ := ADDateTime2Time(EncodeTime(wHourwMinwSec0));       // Delphi does not support negative time value, and TimeToStr for -0.123       // returns the same value as for 0.123       if lNeg then         PLongint(ADestData)^ := - PLongint(ADestData)^;     end;

Re:SEC_TO_TIME
Posted: 2007/09/13 04:34
 
Спасибо!