Как фильтровать таблицу ETS без ets: выберите


У меня есть модуль, где я храню некоторые данные в таблице ETS Теперь я пытаюсь фильтровать данные, повторяя таблицу ETS, но всегда получаю пустой [список]. (это соответствие каждый раз-соответствие ('$end_of_table', Acc) - > Acc;)

-module(t).
-export([matching/0]).


matching() -> matching(ets:first(auth), []).
matching('$end_of_table', Acc) -> Acc;
matching(Key, Acc) ->
            FromSec = calendar:datetime_to_gregorian_seconds({{2017,1,12}, {11,00,00}}),
            ToSec = calendar:datetime_to_gregorian_seconds({{2017,1,12}, {12,00,00}}), 
    case ets:lookup(auth, Key) of
  [{Login, Pass, TTL, Unix, Unix2}] when Unix2 >= FromSec, Unix2 =< ToSec -> NewAcc = [{Login, Pass, TTL, Unix, Unix2}|Acc],
            N = ets:next(auth, Key),
                    matching(N, NewAcc);
  _ -> N = ets:next(auth, Key),
                    matching(N, Acc)
         end.

Может быть, я неправильно создал таблицу ETS ?

2 2

2 ответа:

Имена переменных Unix и Unix2 предполагают, что вы храните метки времени Unix, то есть количество секунд, прошедших с 1970 года, но функция calendar:datetime_to_gregorian_seconds возвращает количество секунд, прошедших с года 0. (См. документацию .) Таким образом, ваше сравнение Unix2 >= FromSec, Unix2 =< ToSec всегда будет ложным.

Модуль календаря использует смещение ?DAYS_FROM_0_TO_1970 * ?SECONDS_PER_DAY для преобразования между ними, при этом макросы определяются следующим образом:

-define(SECONDS_PER_DAY, 86400).
-define(DAYS_FROM_0_TO_1970, 719528).

См., например, реализацию calendar:now_to_datetime/1.

Нашел ответ!

Главное, что unixtime и календарь: datetime_to_gregorian_seconds({{2017,1,12}, {11,00,00}}) различны

Так что это все соответствует соответствию ('$end_of_table', Acc) - > Acc;