Оптимальный способ сохранить значения даты и времени в базе данных SQLite (Delphi)

Я буду хранить значения даты и времени в базе данных SQLite (использующий Delphi и библиотеку DISqlite). Природа дб такова, что это никогда не должно будет передаваться между компьютерами или системами, таким образом, совместимость не будет ограничением. Мой фокус вместо этого находится на скорости считывания. Поле даты и времени будет индексировано, и я буду искать на нем много, а также читать в тысячах значений даты и времени в последовательности.

Так как SQLite не имеет явного типа данных для значений даты и времени, существует несколько опций:

  • используйте Тип данных real и сохраните значения TDateTime Delphi непосредственно: самый быстрый, никакое преобразование из строки на загрузке; невозможный отладить даты с помощью менеджера по дб, такие как SQLiteSpy, так как даты не будут человекочитаемы. Не может использовать функции даты SQLite (?)

  • используйте формат простой строки, например, YYYYMMDDHHNNSS: преобразование требуется, но относительно легко на ЦП (никакая потребность просканировать для разделителей), данные человекочитаемы. Все еще не может использовать функции даты SQLite.

  • сделайте что-то еще. Что состоит в том, чтобы сделать рекомендуемая вещь?

Я прочитал http://www.sqlite.org/lang_datefunc.html, но нет никакого упоминания о том, какой тип данных использовать, и, не будучи официально обученным в программировании, я не делаю вполне grok внимания на даты Julian. Почему дополнительное преобразование? Я буду читать в этих значениях много, таким образом, любые дополнительные преобразования между строками и TDateTime добавят значительную стоимость.

8
задан Marek Jedliński 21 January 2010 в 01:10
поделиться

4 ответа

Вы можете использовать один из SQLite поддерживаемых строковых форматов, например. ГГГГ-ММ-ДД ХХ: ММ: SS.SSSS .

Это было бы так же просто, как yyyymmddhnnss - вам все равно не нужно будет сканировать для сепараторов, поскольку все номера являются фиксированными длиной - и вы получите поддержку функции SQLite Date.

Если вам нужна поддержка функции SQLite Date, я бы пошел с этим методом.

Если нет, я бы порекомендовал использовать REAL значений. Вы все еще можете сравнить их друг с другом (более высокие числа позже в дальнейшем) и рассмотрите дату и время отдельно (до и после десятичной точки соответственно) без преобразования в TDateTime.

8
ответ дан 5 December 2019 в 11:24
поделиться

Одним из компромиссов было бы придерживаться REAL-значений, но сохранять их как юлианские даты, используя Delphi's DateTimeToJulianDate. Таким образом, они остаются быстрыми для чтения, в конвейере мало что теряется в производительности, и они все еще находятся в формате, который имеет смысл за пределами Delphi.

5
ответ дан 5 December 2019 в 11:24
поделиться

Для этого я обычно использую тип целочисленного типа и храните значение Timestamp Unix (например, секунды Unix (EQ #, например, с 1-1-12000). Расчет этого T / из TDateTIME равен умножению / дайвию с / на 86400 и добавление константы для «с».

Если вам нужна более точность, вы можете использовать DateTime в качестве FileTime (например, INT64), который имеет 100 нс. В Sysutils есть процедуры преобразования в Sysutils, и ваш меток времени хранится в UTC.

2
ответ дан 5 December 2019 в 11:24
поделиться

Если ваша забота является лишь человеком читабельный формат на уровне базы данных, вы можете хранить две отдельные поля, например:

delphi_date Real (двойной, если возможно, но я не t знать sqlite), проиндексировал. Все ваши программные запросы и сравнения должны использовать это поле.

Human_readable_date varchar (23) с форматом "yyyy-mm-dd hh: мм: ss.ssss '. Может быть, проиндексирован (если действительно необходимо). Большинство человеческих входов должны включать в себя это поле, и вы можете использовать (как сказал другие) функции SQLite Date.

У него есть некоторые недостатки:

  • Расход пространства в базе данных и сетевой трафик растет,
  • операции вставки будут иметь немного больше, потому что необходимое преобразование,
  • Нет автоматического синхронизации между значениями, если они обновляются за пределами вашей программы

Если он подходит для ваших конкретных потребностей, зависит от вас.

0
ответ дан 5 December 2019 в 11:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: