Как фильтровать таблицу 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 ответа:
Имена переменных
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
.