2017-01-12 12 views
2

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

-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 неправильно?

ответ

4

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

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

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

Смотрите, например the implementation of calendar:now_to_datetime/1.

+0

Yeap. Просто разобрался. и отправьте ответ. Спасибо за ваш ответ – Qbeck

0

Найден ответ!

главное, что UnixTime и календарь: datetime_to_gregorian_seconds ({{2017,1,12}, {11,00,00}}) отличаются

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