DELPHI: Sqlite Формат даты и времени, как? Пожалуйста помоги - PullRequest
1 голос
/ 22 ноября 2010

Я новичок в SQLite, и мне было интересно, что является лучшим форматом в SQLite для хранения даты и времени?

Я пытался сохранить дату (аналогично времени), используя что-то вроде этого (я установил поле даты / времени SQLite как CHAR)

SQLStr:='INSERT INTO MYTABLE ([DATE]) VALUES ('+#39+FormatDateTime('YYYY-MM-DD',MyDate)+#39+')';

ExecSql работал (я думаю), так как я вижу добавленную дату в таблице.

Но когда я пытаюсь открыть поле с помощью функции StrToDate, он всегда говорит, например, 2010-11-23 - недопустимая дата.

Я не уверен, но я думаю, что StrToDate не подходит для этой операции. Если да, то что?

Помощь

Спасибо! :)

Я использую D5, ZeosLib 6.6.6 и Sqlite3.dll

Ответы [ 3 ]

1 голос
/ 22 ноября 2010

Я храню даты Delphi в виде юлианских дат и выполняю преобразование между ними, используя Delphi's DateTimeToJulianDate и JulianDateToDateTime. Я делаю много запросов, связанных с датами, и сохранение дат в виде числовых (REAL) значений, а не значений TEXT, позволяет более эффективно выполнять запросы, например:

ВЫБРАТЬ * из таблицы ГДЕ дата (julianday (datecolumn, "LOCALTIME")) = дата (julianday ("now", "LOCALTIME"))

1 голос
/ 22 ноября 2010

Чтобы преобразовать строку в базе данных в дату / время, вы можете использовать StrToDate (const S: строка; const AFormatSettings: TFormatSettings) .

Параметр AFormatSettings можно использовать для настройки разделителей даты и времени.


Нельзя объявлять типы дат в SQLite 3:

См .: http://www.sqlite.org/datatype3.html

Могут использоваться следующие типы:

  • ТЕКСТ в виде строк ISO8601 («ГГГГ-ММ-ДД ЧЧ: ММ: СС.ССС»).
  • НАСТОЯЩАЯ как числа юлианских дней, количество дней с полудня в Гринвиче 24 ноября 4714 г. до н. по лептеру григорианского календаря.
  • INTEGER как Unix Time, количество секунд с 1970-01-01 00:00:00 UTC

В Delphi в качестве одного из способов использования типов полей базы данных даты / времени можно использовать вычисляемое поле типа TDateTimeField и выполнить преобразование в событии OnCalcFields.

Обновление : для преобразования из Unix Time в TDateTime вы можете использовать функцию UnixToDateTime в модуле DateUtils.

0 голосов
/ 23 ноября 2010

Поскольку я однажды задал один и тот же точный вопрос, возможно, полученные ответы помогут: Оптимальный способ хранения значений даты и времени в базе данных SQLite (Delphi)

FWIW, я хранюTDateTime напрямую как РЕАЛЬНЫЕ значения в SQLite.Они не читаются человеком, если вы смотрите непосредственно на базу данных, но это быстрее и проще, чем использование строк, поскольку преобразование не выполняется.В Delphi достаточно собственных методов манипулирования датами, чтобы сделать из них встроенные в SQLite избыточные.

Конечно, я не рекомендую, чтобы к вашей базе данных когда-либо обращались приложения, не написанные на Delphi, поскольку они не понимаютDelphi's TDateTime.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...