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

标签 erlang erlang-otp ets

我有一个模块,可以在 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 表?

最佳答案

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

关于erlang - 如何在没有 ets 的情况下过滤 ETS 表 :select,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41612597/

相关文章:

functional-programming - 在 Erlang 中作为参数的函数

Erlang 元组列表 jsx :encode error

ubuntu - 如何在 Ubuntu 18/19 上升级 Elixir 版本

data-structures - 不同的 ETS 表类型之间有什么区别?

erlang - 是否有更简单的方法来修改 Erlang 中 subsubsub 记录字段中的值?

erlang - Node 的 Web Worker 会取代 Erlang 吗?

list - 在 Erlang ETS 中存储列表

erlang - 遍历和更新 Erlang ETS 表中所有元素的最佳方法是什么?

ssl - 使用 Erlang 无需验证即可获取客户端证书

erlang - Id 到 Pid 的映射应该存储在 ets 表中还是 gen_server 的状态中?