Проблема, TSQLQuery поле DateTime выводит как 30.12.1899

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Проблема, TSQLQuery поле DateTime выводит как 30.12.1899

Сообщение JohnCS » 31.07.2014 12:19:31

Добрый день.
Есть база данных SQLite3.
Компоненты для подключения: TSQLConnector, TSQLTransaction, TSQLQuery, TDatasource, TDBGrid.
При запросе SELECT * FROM table поля с типом DateTime выводятся как '30.12.1899' (поля не пустые).
При просмотре таблицы например SQLite Manager эти поля отображаются корректно.

Может, кто уже сталкивался с данной проблемой?
JohnCS
незнакомец
 
Сообщения: 3
Зарегистрирован: 31.07.2014 12:11:06

Re: Проблема, TSQLQuery поле DateTime выводит как 30.12.1899

Сообщение VirtUX » 05.08.2014 08:23:29

Рискну предположить:
mysql хранит дату как: гггг.мм.дд, а не дд.мм.гггг. Если при преобразовании strtodate на учесть этот нюанс, то дата отобразится как дефолтная. Возможно это происходит и в Вашем случае?
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Проблема, TSQLQuery поле DateTime выводит как 30.12.1899

Сообщение JohnCS » 05.08.2014 14:50:04

VirtUX писал(а):Рискну предположить:
mysql хранит дату как: гггг.мм.дд, а не дд.мм.гггг. Если при преобразовании strtodate на учесть этот нюанс, то дата отобразится как дефолтная. Возможно это происходит и в Вашем случае?


Возможно, но я никаких манипуляций с данными не делаю. Накидал компоненты на форму, связал их и запустил приложение.
Возможно это баг одного из компонентов...
JohnCS
незнакомец
 
Сообщения: 3
Зарегистрирован: 31.07.2014 12:11:06

Re: Проблема, TSQLQuery поле DateTime выводит как 30.12.1899

Сообщение VirtUX » 05.08.2014 16:56:47

с помощью какого компонента Вы выводите дату? Проверьте вывод результата в простом текстовом компоненте без форматирования и преобразования (TEdit, TMemo, etc.)
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Проблема, TSQLQuery поле DateTime выводит как 30.12.1899

Сообщение JohnCS » 06.08.2014 15:00:07

Все поля выводятся TDBGrid. В отладчике смотрел значения получаемых полей, в формате TDateTime возвращается 0, а в String - '30.12.1899'.
Сегодня получил ответ от багрепорта Лазарус:
Looking at the db with a hex editor and tracing the sqlite code: your date/time are encoded as strings: e.g.
2013-09-23T16:41:10

which is not identified correctly by the connector:
// Parses string-formatted date into TDateTime value
// Expected format: '2013-12-31 ' (without ')
Function ParseSQLiteDate(S : ShortString) : TDateTime;

Var
Year, Month, Day : Integer;

begin
Result:=0;
If TryStrToInt(NextWord(S,'-'),Year) then
if TryStrToInt(NextWord(S,'-'),Month) then
if TryStrToInt(NextWord(S,' '),Day) then
Result:=EncodeDate(Year,Month,Day);
end;

// Parses string-formatted time into TDateTime value
// Expected format '23:59:59.999' (without ')
Function ParseSQLiteTime(S : ShortString; Interval: boolean) : TDateTime;

Var
Hour, Min, Sec, MSec : Integer;

begin
Result:=0;
If TryStrToInt(NextWord(S,':'),Hour) then
if TryStrToInt(NextWord(S,':'),Min) then
if TryStrToInt(NextWord(S,'.'),Sec) then
begin
MSec:=StrToIntDef(S,0);
if Interval then
Result:=EncodeTimeInterval(Hour,Min,Sec,MSec)
else
Result:=EncodeTime(Hour,Min,Sec,MSec);
end;
end;
(note: sqlite newb here)

Went digging into sqlite docs:
http://www.sqlite.org/datatype3.html [^]
1.2 Date and Time Datatype
date/time can be stored as integer (unix epoch), real as Julian day numbers and (ISO 8601 subset string as defined in
http://www.sqlite.org/lang_datefunc.html [^]
A time string can be in any of the following formats:
1 YYYY-MM-DD
2 YYYY-MM-DD HH:MM
3 YYYY-MM-DD HH:MM:SS
4 YYYY-MM-DD HH:MM:SS.SSS
5 YYYY-MM-DDTHH:MM
6 YYYY-MM-DDTHH:MM:SS
7 YYYY-MM-DDTHH:MM:SS.SSS
8 HH:MM
9 HH:MM:SS
10 HH:MM:SS.SSS
11 now
12 DDDDDDDDDD
So it would make sense to extend current support for 4 and 10 with 1-10.


В общем вывод такой: либо свой парсер писать, либо менять формат даты в базе. Самостоятельно компоненты от SQLdb этого не делают по всей видимости.
Кстати, компоненты от ZeosLib прекрасно все отображают и дописывать/менять ничего не нужно.
Пока буду пользоваться ZeosLib.

Добавлено спустя 2 минуты 42 секунды:
Спасибо за помощь.
Вопрос снят.
JohnCS
незнакомец
 
Сообщения: 3
Зарегистрирован: 31.07.2014 12:11:06


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 214

Рейтинг@Mail.ru
cron