2

我有在 ETS 表中存储一些数据的模块现在我正在尝试过滤迭代 ETS 表的数据,但总是为空 [List]。(这个每次都匹配——matching('$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 表吗?

4

2 回答 2

4

变量名称UnixUnix2建议您存储 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参见.

于 2017-01-12T12:21:41.047 回答
0

找到了答案!

unixtime 和 calendar:datetime_to_gregorian_seconds({{2017,1,12}, {11,00,00}}) 的主要区别

所以一切都匹配匹配('$end_of_table',Acc)-> Acc;

于 2017-01-12T12:28:41.763 回答