Какой наиболее эффективный способ обработки DateTimes, особенно потому, что столбец DATETIME приводит к ЧИСЛЕННОМУ?

qaru.site/info/4012/..., которые цитируют тот же раздел документации (следующим образом):

SQLite не имеет класса хранения, зарезервированного для хранения дат и/или времени. Вместо этого встроенные функции даты и времени SQLite способны хранить даты и время как значения TEXT, REAL или INTEGER:

  • ТЕКСТ как строки ISO8601 ( "ГГГГ-ММ-ДД ЧЧ: ММ: SS.SSS" ).
  • REAL, как число юлианских дней, количество дней с полудня в Гринвиче 24 ноября 4714 г. B.C. согласно пролептическому григорианскому календарю.
  • INTEGER as Unix Time, количество секунд с 1970-01-01 00:00:00 UTC.

Приложения могут выбирать даты и время в любом из этих форматов и свободно конвертировать между форматами, используя встроенные функции даты и времени.

Однако я думаю, что некоторые люди (вопросники и ответчики) путают или опускают следующую информацию о создании таблицы, где DateTime на самом деле является NUMERIC внутри и должен быть создан как DATETIME или ЧИСЛО, чтобы избежать проблем с производительностью, относящихся к кастингу.

Возможно, я что-то недопонимаю, но я вижу ответы там, где люди говорят о создании столбца TEXT для datetime, что не кажется эффективным.

Вопрос

Учитывая, что я могу запросить столбец datetime как TEXT, REAL или INTEGER, что является наиболее эффективным способом обработки datetimes, тем более, что столбец DATETIME приводит к NUMERIC.

  • Имеет ли тип columnType из NUMERIC/DateTime задерживающие литье из-за сравнения TEXT, REAL или Integer?

  • Может ли тип столбца TEXT и тип запроса TEXT для SQLite быть быстрее?

  • Может ли REAL тип столбца и тип запроса REAL для SQLite быть быстрее?

  • Может ли быть тип столбца INTEGER и тип запроса INTEGER для SQLite быстрее?

  • Как бы преобразовать DATETIME в NUMERIC для более быстрых запросов?

Ответы

Ответ 1

В интересах тех, кто задает вышеизложенный вопрос или отвечает на него с излишним фокусом на теории, я предлагаю ответ, который пытается решить намерение вашего вопроса... "что является самым эффективным способом обработки данных" в контекст "особенно потому, что столбец DATETIME приводит к ЧИСЛЕННОМУ". И вы также упоминаете мобильные устройства в своих комментариях.

Во-первых, в контексте мобильных устройств вам редко приходится обращаться к большим наборам данных. Таким образом, самый эффективный код, который вы пишете, - это код, который не сбивает с толку, когда вам нужно его менять и работает даже по мере развития структуры.

Таким образом, может работать строка или целое число, в зависимости от того, с чем вы наиболее комфортно работаете. Если вы запутались в работе с датами как целыми числами, используйте строки. Если вам нужно подвергать работу группе, которая любит строки, ищите ее.

Тем не менее, если вы действительно управляете производительностью устройства, то при использовании индексов самые быстрые сравнения являются самыми быстрыми. И если у вас проблема с производительностью, ее обычно лучше всего разрешать с помощью индекса.

Итак, чтобы ответить на вопрос, все вопросы - да, результаты кастинга в задержках, но эти задержки обычно не имеют значения, потому что вы имеете дело с небольшими наборами данных. Однако, когда это имеет значение, интегральные сравнения являются самыми быстрыми (что хорошо документировано, как и вопросы, которые вы цитируете), поэтому конвертируйте значения DATETIME в целые числа, чтобы оптимизировать производительность запросов.

В вашем заголовке конкретно упоминаются слова "INSERT" и "UPDATE", которые затем поднимают вопрос: "Действительно ли вам нужен индекс, если для вас важны показатели INSERT и UPDATE? Индексирование добавляет дополнительные издержки в инструкции INSERT и UPDATE". Это также обычно не имеет значения из-за относительно высокой вычислительной мощности и невозможности создания ситуаций с большим количеством операторов INSERT или UPDATE на мобильных устройствах в целом.

Однако, если это действительно проблема, тогда становится проблемой стандартная оптимизация БД для транзакций и запросов. Возможно, вам понадобится создать две базы данных, одну для поддержки INSERT/UPDATE, а другую для запросов с некоторым процессом синхронизации. Или вам, возможно, придется сделать сознательные компромиссы для ситуаций INSERT/UPDATE и SELECT, с которыми вы сталкиваетесь.

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

Тем не менее, короткий ответ - "это, вероятно, не имеет значения", и если да, то используйте INTEGER, если вы не можете быть более конкретным в своем конкретном случае использования.

Ответ 2

Эти вопросы предполагают факты, которые на самом деле не верны.

SQLite не имеет типов столбцов. Есть только столбцы аффинности, которые не ограничивают, какие типы могут быть фактически сохранены в столбце.

Нет специального типа DATETIME. Когда в документации упоминаются TEXT, REAL и INTEGER, это означает, что вы действительно должны использовать один из этих типов для своих значений. И как только вы используете одно такое значение, SQLite не будет автоматически преобразовывать его в другой тип, поскольку он не знает, что это значение является значением даты/времени.

Имеет ли тип columnType из NUMERIC/DateTime задерживающие литья из-за сравнения TEXT, REAL или Integer?

Вы получаете задержки забрасывания только тогда, когда у вас есть значения одного типа, хранящиеся в столбце, и сравниваются с другим типом. (И строка типа '1970-01-01' никогда не будет равна числу, подобному 0, поэтому такие сравнения не имеют смысла.)

Может ли тип столбца TEXT и тип запроса TEXT для SQLite быть быстрее?

Тип столбца на самом деле не имеет значения.

Если вы сохраняете значения TEXT в столбце, вы должны запрашивать значения TEXT.
Если вы сохраняете значения REAL в столбце, вы должны запрашивать значения REAL.
Если вы сохраняете значения INTEGER в столбце, вы должны запрашивать значения INTEGER.

Как бы преобразовать DATETIME в NUMERIC для более быстрых запросов?

Нет типа DATETIME.