如何在没有 ets:select 的情况下过滤 ETS 表



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

变量名称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的实现。

找到了答案!

Unixtime和calendar:datetime_to_gregorian_seconds({{2017,1,12}, {11,00,00}}) 是不同的

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

相关内容

  • 没有找到相关文章

最新更新