2015-09-21 1 views
3

Кажется, django, или база данных sqlite, хранит данные с точностью до микросекунды. Однако, когда passing a time to javascript на Date объект поддерживает только миллисекунды:Сохранение точности микросекунды при передаче datetime между django и javascript

var stringFromDjango = "2015-08-01 01:24:58.520124+10:00"; 
var time = new Date(stringFromDjango); 
$('#time_field').val(time.toISOString()); //"2015-07-31T15:24:58.520Z" 

Обратите внимание на 58.520124 теперь 58.520.

Это становится проблемой, когда, например, я хочу создать набор запросов для всех объектов с дат-временем, меньшим или равным времени существующего объекта (т. Е. MyModel.objects.filter(time__lte=javascript_datetime)). Усечением микросекунды объект больше не отображается в списке, так как время не равно.

Как я могу обойти это? Есть ли объект javascript datetime, поддерживающий точность в микросекундах? Могу ли я обрезать время в базе данных до миллисекунд (я в значительной степени использую auto_now_add всюду) или попросить выполнить запрос с пониженной точностью?

ответ

1

Как я могу обойти это?

TL; DR: Store меньше точности, либо:

  • уговаривая вашу БД платформу для хранения только миллисекунды и отбросить любую дополнительную точность (трудный на SQLite, я думаю)
  • только когда-либо вставив значения с точностью вы хотите (трудно убедиться, что вы покрыли все случаи)

есть DateTime объектов JavaScript, который поддерживает микрофон Росекундная точность?

Если вы кодируете свои даты как Строки или Числа, вы можете добавить любую точность, которую хотите. Существуют и другие варианты (некоторые обсуждаются in this thread). Если вы на самом деле хотите эту точность, это, вероятно, не самый лучший подход.

Могу ли я укоротить раз в базе данных в миллисекундах ..

Да, но потому, что вы на SQLite это немного странно. SQLite не имеет дат; вы фактически сохраняете значения в поле text, real или integer. Эти базовые классы хранения определяют точность и диапазон значений, которые вы можете сохранить. Там приличный write up of the differences here.

Вы можете, например, изменить базовый класс хранения на integer. Это приведет к усечению дат, сохраненных в этом поле, с точностью до 1 секунды. При выполнении запросов от JS вы также можете урезать свои даты, используя Date.prototype.setMilliseconds() function. Например:

MyModel.objects.filter(time__lte = javascript_datetime.setMilliseconds(0)) 

Более функциональная платформа DB будет обрабатывать ее лучше. Например, в PostgreSQL вы можете specify the precision stored more exactly. Это добавит столбец временной отметки с точностью до миллисекунд (соответствующий Javascript).

alter table "my_table" add "my_timestamp" timestamp (3) with time zone 

MySQL будет let you do the same thing.

.. или попросить выполнить запрос с пониженной точностью?

Да, но это, как правило, неправильный подход.

Если критерии, которые вы фильтруете от, являются точными, тогда вы в порядке; вы можете усечь значение, а затем фильтр (например, в примере ..setMilliseconds()). Но если значения в БД вы проверяете против, вы слишком точны, у вас будет плохое время.

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

Смежные вопросы