2016-09-30 2 views
0

Итак, у меня просто был большой «Oh Snap!». момент.Querying MomentJS даты на IndexedDB & AngularJS - Даты против строк

Я использую MomentJS с AngularJS и IndexedDB в автономном приложении.

Все мои записи хранятся с индексом date_idx на основе свойства даты объекта.

Проблема возникает, когда я пытаюсь запустить запросов на основе даты, используя следующий код:

$scope.redoresults = function(){ 
    $indexedDB.openStore('records', function(store){ 
    $scope.upper = moment($scope.dates.endDate).format("DD[/]MM[/]YYYY"); 
    $scope.downer = moment($scope.dates.startDate).format("DD[/]MM[/]YYYY"); 

    var find = store.query(); 
    find = find.$between($scope.downer, $scope.upper, false, false); 
    find = find.$index("date_idx"); 
    store.eachWhere(find).then(function(e){ 
     $scope.daterange = e; 
     console.log($scope.daterange); 
    }); 
    }); 
}; 

Запрос поставлял странные результаты, иногда правильные, иногда нет. До тех пор, пока я не понял, что на самом деле я запрашиваю строки, а не даты. Будучи таким, запрос между 01/08/2016 и 31/08/2016, по-прежнему доставит мне результаты, содержащие 20/09/2016, потому что в качестве номера это действительно между диапазоном.

Я чувствую, что у меня отсутствует что-то структурное.

Любые комментарии о том, как решить эту проблему?

Должен ли я запрашивать какой-либо другой индекс? Но как я могу сравнить даты?

+3

даты хранения как строки ISO или временные метки – charlietfl

ответ

2
  • Хранить даты как даты и запросы по датам.
  • Или укажите даты как временные метки (например, date.getTime()), а затем запрос с использованием временных меток
  • Не храните даты как даты, а затем запрос с строковой датой, это приведет к сбою.
  • Не храните даты в виде строк, а затем запросите дату строки, это приведет к нежелательной. Значения строк сравниваются лексикографически, что может легко отходить от того, как сопоставляются даты.
Смежные вопросы