Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Zeos и Int64


Автор: Pavelbej 27.5.2009, 00:39
Здравствуйте!

Хотел бы узнать как решить проблему если кто сталкивался.
Пользуюсь компонентами http://zeos.firmos.at/viewforum.php?f=21. С их помощью я загружаю в свою программу закладки браузера Firefox (файл places.sqlite - sqlite3). Так вот в таблице есть поле "dateAdded" со значением "1243282211640625" (http://en.wikipedia.org/wiki/Unix_time)
Читаю значение так:
Код

FormatDateTime('', UnixToDateTime(fieldbyname('dateAdded').AsInteger))

Результата нет. Просто прочесть число, без конвертации, возвращяет ноль.

Если не ошибаюсь, то чтобы хранить такое число (конвертировать ее), нужен тип Int64, а ".AsInteger" является Longint.
Код

 property AsInteger: Longint read GetAsInteger write SetAsInteger;

модуль DB

Помогите разобратся в чем проблема, в компонентах, в чем-то другом, или я вообще не туда копаю?
Совсем запутался

Автор: Akella 27.5.2009, 08:48
у FormatDateTime разве первым параметром не должен идти сам формат отображения??

Добавлено через 6 минут и 26 секунд
Цитата(Pavelbej @  27.5.2009,  00:39 Найти цитируемый пост)
есть поле "dateAdded" со значением "1243282211640625" (Unix time)

Ты уверен, что там именно такое значение? Может там что-то типа 125584,1251?

Добавлено через 7 минут и 23 секунды
Код
FormatDateTime('dd/mm/yyyy - hh:nn:ss:zzz', UnixToDateTime(fieldbyname('dateAdded').AsInteger))

Автор: Pavelbej 27.5.2009, 14:02
Цитата(Akella @  27.5.2009,  08:48 Найти цитируемый пост)
у FormatDateTime разве первым параметром не должен идти сам формат отображения??

Как раз так и отображается как нужно: 24.05.2009 16:00:23
Да это и не важно, даже так не читается:
Код

fieldbyname('dateAdded').AsInteger
fieldbyname('dateAdded').AsString


Цитата(Akella @  27.5.2009,  08:48 Найти цитируемый пост)
Ты уверен, что там именно такое значение? Может там что-то типа 125584,1251?

Уверен:
Цитата

PRTime Format
PRTime is very similar to Unix or POSIX time. As the table below shows:

Name  Format  Epoch  Increments
PRTime  64-bit integer  Midnight 1 January 1970 UTC  Microseconds
Unix / POSIX  32-bit integer  Midnight 1 January 1970 UTC  Seconds

As a microsecond is one millionth of a second you can easily convert PRTime to UNIX time by dividing the PRTime value by 1,000,000.

In the example above of PRTime 1221842272303080, if we divide this by 1,000,000 we get 1221842272.30308. Now if we drop the fractional part we have the UNIX timestamp of 1221842272 which, as above, converts to Friday, September 19th 2008, 16:37:52 (UTC).

http://www.firefoxforensics.com/research/prtime.shtml


Автор: Akella 27.5.2009, 23:02
а если 
Код

Var
 i64: int64;
begin
...
i64 := fieldbyname('dateAdded').AsInt64;




Цитата(Pavelbej @  27.5.2009,  00:39 Найти цитируемый пост)
Читаю значение так:


Цитата(Pavelbej @  27.5.2009,  00:39 Найти цитируемый пост)
Результата нет.

И куда, позволь спросить, ты читаешь? smile 

Автор: Pavelbej 28.5.2009, 11:11
Цитата(Akella @  27.5.2009,  23:02 Найти цитируемый пост)
.AsInt64;

"Нет такой буквы в этом слове"
Undeclared identifier: 'AsInt64'

Цитата(Akella @  27.5.2009,  23:02 Найти цитируемый пост)
И куда, позволь спросить, ты читаешь? smile  

Да невозможно получить данные ни в строковую переменную, ни в integer.
Выдает пустую строку и ноль соответственно.

Автор: Akella 28.5.2009, 16:17
а так?
Код

ShowMessage(VarToStr(fieldbyname('dateAdded').Asvariant));


Добавлено через 1 минуту и 16 секунд
Цитата(Pavelbej @  28.5.2009,  11:11 Найти цитируемый пост)
Выдает пустую строку и ноль соответственно. 

А ты уверен, что значение есть в поле? мож его там попросту нет?
А в гриде показывается значение?

Автор: Pavelbej 28.5.2009, 23:55
Цитата(Akella @  28.5.2009,  16:17 Найти цитируемый пост)

а так?
ShowMessage(VarToStr(fieldbyname('dateAdded').Asvariant));

Таже картина


Цитата(Akella @  28.5.2009,  16:17 Найти цитируемый пост)
А ты уверен, что значение есть в поле? мож его там попросту нет? 

Есть конечно. Ведь Firefox дату создания, изменения закладки показывает.
А вот что видно если отрыть базу через SQLite Database Browser:
http://picbite.com/image/52323qjafa/

А тип поля является Integer:
http://picbite.com/image/52324bbjtt/

Всеже, кажется компонент не поддерживает int64

Автор: Akella 29.5.2009, 20:34
Хммм... Может проблема с Zeos? 

Автор: Romikgy 8.6.2009, 16:22
скорее всего .... 
Цитата(Akella @  29.5.2009,  19:34 Найти цитируемый пост)
проблема с Zeos

ибо 
Код

INTEGER. The value is a signed integer, stored in 1, 2, 3, 4, 6, or 8 bytes depending on the magnitude of the value.

http://sqlite.org/datatype3.html

8 байтовое целое 
Цитата(Akella @  27.5.2009,  07:48 Найти цитируемый пост)
.AsInteger

имхо не потянет ....

Автор: Akella 9.6.2009, 09:56
Цитата
ZTable1.FieldByName('').AsSQLTimeStamp

Автор: Romikgy 9.6.2009, 10:30
Цитата(Pavelbej @  26.5.2009,  23:39 Найти цитируемый пост)
со значением "1243282211640625" (Unix time)


Цитата(Akella @  9.6.2009,  08:56 Найти цитируемый пост)
.AsSQLTimeStamp

Код

TSQLTimeStamp represents time and date values with a high degree of accuracy.

Unit

SqlTimSt

Delphi syntax:

type TSQLTimeStamp = packed record

    Year : SmallInt;
    Month : Word;
    Day : Word;
    Hour : Word;
    Minute : Word;
    Second : Word;
    Fractions : LongWord;
  end;

имхо не равно...

Автор: Akella 10.6.2009, 09:00
Код

Var
 SQLTimeStamp: TSQLTimeStamp;
begin
...
  SQLTimeStamp := ZTable1.FieldByName('pole1').AsSQLTimeStamp;
....

теперь можно из переменной SQLTimeStamp вытянуть информацию

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)