Должен ли я беспокоиться о хранении данных DateTime как julianday в SQLite?

SQLite docs указывает, что предпочтительным форматом для хранения значений datetime в БД является использование Julian Day (с использованием встроенных функций).

однако все фреймворки, которые я видел в python (pysqlite, SQLAlchemy), хранят datetime.datetime значения как ISO отформатированные строки. Почему они это делают?

Я обычно пытаюсь адаптировать фреймворки для хранения datetime как julianday, и это довольно болезненно. Я начал сомневаться, что это стоит усилий.

пожалуйста, поделитесь ваш опыт работы со мной в этой области. Не торчит julianday смысл?

4 ответов


хранить в обоих направлениях. Фреймворки могут быть установлены по-своему, и если ваш ожидает найти необработанный столбец со строкой в формате ISO, то это, вероятно, больше боли, чтобы обойти, чем это стоит.

проблема в наличии двух столбцов-это согласованность данных, но sqlite должен иметь все необходимое для его работы. Версия 3.3 имеет поддержку проверочные ограничения и триггеры. Читайте на функции даты и времени. Ты должен уметь делать то, что тебе нужно. полностью в базе данных.

CREATE TABLE Table1 (jd, isotime);

CREATE TRIGGER trigger_name_1 AFTER INSERT ON Table1
BEGIN
    UPDATE Table1 SET jd = julianday(isotime) WHERE rowid = last_insert_rowid();
END;

CREATE TRIGGER trigger_name_2 AFTER UPDATE OF isotime ON Table1
BEGIN
    UPDATE Table1 SET jd = julianday(isotime) WHERE rowid = old.rowid;
END;

и если вы не можете сделать то, что вам нужно в БД, вы можете написать расширение C для выполнения необходимых функций. Таким образом, вам не нужно будет касаться фреймворка, кроме как загружать расширение.


Джулиан день удобен для всех видов вычислений даты, но он может хранить времени часть прилично (с точными часами, минутами и секундами). В прошлом я использовал как поля Julian Day (для дат), так и секунды-от-эпохи (для datetime экземпляры), но только когда у меня были конкретные потребности в вычислениях (дат и соответственно времени). Простота ISO-форматированных дат и времени, я думаю, должна сделать их предпочтительным выбором, скажем, около 97% время.


но обычно человек не читает непосредственно из базы данных. Дробное время в Юлианский день легко преобразуется в человеческое, читаемое (например)

void hour_time(GenericDate *ConvertObject)
{
    double frac_time    = ConvertObject->jd;
    double hour         = (24.0*(frac_time - (int)frac_time));
    double minute       = 60.0*(hour - (int)hour);
    double second       = 60.0*(minute - (int)minute);
    double microsecond  = 1000000.0*(second - (int)second);

    ConvertObject->hour         = hour;
    ConvertObject->minute       = minute;
    ConvertObject->second       = second;
    ConvertObject->microsecond  = microsecond;

};

, потому что 2010-06-22 00:45:56 гораздо легче для человека читать, чем 2455369.5318981484. Текстовые даты отлично подходят для выполнения специальных запросов в Sqlitespy или SQLite Manager.

основным недостатком, конечно, является то, что текстовые даты требуют 19 байтов вместо 8.