Я буду хранить значения даты и времени в базе данных SQLite (использующий Delphi и библиотеку DISqlite). Природа дб такова, что это никогда не должно будет передаваться между компьютерами или системами, таким образом, совместимость не будет ограничением. Мой фокус вместо этого находится на скорости считывания. Поле даты и времени будет индексировано, и я буду искать на нем много, а также читать в тысячах значений даты и времени в последовательности.
Так как SQLite не имеет явного типа данных для значений даты и времени, существует несколько опций:
используйте Тип данных real и сохраните значения TDateTime Delphi непосредственно: самый быстрый, никакое преобразование из строки на загрузке; невозможный отладить даты с помощью менеджера по дб, такие как SQLiteSpy, так как даты не будут человекочитаемы. Не может использовать функции даты SQLite (?)
используйте формат простой строки, например, YYYYMMDDHHNNSS: преобразование требуется, но относительно легко на ЦП (никакая потребность просканировать для разделителей), данные человекочитаемы. Все еще не может использовать функции даты SQLite.
сделайте что-то еще. Что состоит в том, чтобы сделать рекомендуемая вещь?
Я прочитал http://www.sqlite.org/lang_datefunc.html, но нет никакого упоминания о том, какой тип данных использовать, и, не будучи официально обученным в программировании, я не делаю вполне grok внимания на даты Julian. Почему дополнительное преобразование? Я буду читать в этих значениях много, таким образом, любые дополнительные преобразования между строками и TDateTime добавят значительную стоимость.
Вы можете использовать один из SQLite поддерживаемых строковых форматов, например. ГГГГ-ММ-ДД ХХ: ММ: SS.SSSS
.
Это было бы так же просто, как yyyymmddhnnss
- вам все равно не нужно будет сканировать для сепараторов, поскольку все номера являются фиксированными длиной - и вы получите поддержку функции SQLite Date.
Если вам нужна поддержка функции SQLite Date, я бы пошел с этим методом.
Если нет, я бы порекомендовал использовать REAL
значений. Вы все еще можете сравнить их друг с другом (более высокие числа позже в дальнейшем) и рассмотрите дату и время отдельно (до и после десятичной точки соответственно) без преобразования в TDateTime.
Одним из компромиссов было бы придерживаться REAL-значений, но сохранять их как юлианские даты, используя Delphi's DateTimeToJulianDate. Таким образом, они остаются быстрыми для чтения, в конвейере мало что теряется в производительности, и они все еще находятся в формате, который имеет смысл за пределами Delphi.
Для этого я обычно использую тип целочисленного типа и храните значение Timestamp Unix (например, секунды Unix (EQ #, например, с 1-1-12000). Расчет этого T / из TDateTIME равен умножению / дайвию с / на 86400 и добавление константы для «с».
Если вам нужна более точность, вы можете использовать DateTime в качестве FileTime (например, INT64), который имеет 100 нс. В Sysutils есть процедуры преобразования в Sysutils, и ваш меток времени хранится в UTC.
Если ваша забота является лишь человеком читабельный формат на уровне базы данных, вы можете хранить две отдельные поля, например:
delphi_date Real (двойной, если возможно, но я не t знать sqlite), проиндексировал. Все ваши программные запросы и сравнения должны использовать это поле.
Human_readable_date varchar (23) с форматом "yyyy-mm-dd hh: мм: ss.ssss '. Может быть, проиндексирован (если действительно необходимо). Большинство человеческих входов должны включать в себя это поле, и вы можете использовать (как сказал другие) функции SQLite Date.
У него есть некоторые недостатки:
Если он подходит для ваших конкретных потребностей, зависит от вас.