Добрый день.
Есть база данных SQLite3.
Компоненты для подключения: TSQLConnector, TSQLTransaction, TSQLQuery, TDatasource, TDBGrid.
При запросе SELECT * FROM table поля с типом DateTime выводятся как '30.12.1899' (поля не пустые).
При просмотре таблицы например SQLite Manager эти поля отображаются корректно.
Может, кто уже сталкивался с данной проблемой?
Проблема, TSQLQuery поле DateTime выводит как 30.12.1899
Модератор: Модераторы
Рискну предположить:
mysql хранит дату как: гггг.мм.дд, а не дд.мм.гггг. Если при преобразовании strtodate на учесть этот нюанс, то дата отобразится как дефолтная. Возможно это происходит и в Вашем случае?
mysql хранит дату как: гггг.мм.дд, а не дд.мм.гггг. Если при преобразовании strtodate на учесть этот нюанс, то дата отобразится как дефолтная. Возможно это происходит и в Вашем случае?
VirtUX писал(а):Рискну предположить:
mysql хранит дату как: гггг.мм.дд, а не дд.мм.гггг. Если при преобразовании strtodate на учесть этот нюанс, то дата отобразится как дефолтная. Возможно это происходит и в Вашем случае?
Возможно, но я никаких манипуляций с данными не делаю. Накидал компоненты на форму, связал их и запустил приложение.
Возможно это баг одного из компонентов...
с помощью какого компонента Вы выводите дату? Проверьте вывод результата в простом текстовом компоненте без форматирования и преобразования (TEdit, TMemo, etc.)
Все поля выводятся TDBGrid. В отладчике смотрел значения получаемых полей, в формате TDateTime возвращается 0, а в String - '30.12.1899'.
Сегодня получил ответ от багрепорта Лазарус:
В общем вывод такой: либо свой парсер писать, либо менять формат даты в базе. Самостоятельно компоненты от SQLdb этого не делают по всей видимости.
Кстати, компоненты от ZeosLib прекрасно все отображают и дописывать/менять ничего не нужно.
Пока буду пользоваться ZeosLib.
Добавлено спустя 2 минуты 42 секунды:
Спасибо за помощь.
Вопрос снят.
Сегодня получил ответ от багрепорта Лазарус:
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 секунды:
Спасибо за помощь.
Вопрос снят.
