首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在没有ETS的情况下过滤ets表:select

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

Stack Overflow用户
提问于 2017-01-12 19:54:36
回答 2查看 144关注 0票数 2

我有一个模块,我在ETS表中存储了一些数据,现在我试图过滤数据,迭代ETS表,但总是得到空列表。(这是每次匹配-匹配(‘$end_of_table’,-> ) Acc;)

代码语言:javascript
复制
-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表?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-12 20:21:41

变量名UnixUnix2表明您存储的是Unix时间戳,即自1970年以来经过的秒数,但函数calendar:datetime_to_gregorian_seconds返回自0年以来经过的秒数。(请参阅documentation。)因此,您的比较Unix2 >= FromSec, Unix2 =< ToSec将始终为false。

日历模块使用偏移量?DAYS_FROM_0_TO_1970 * ?SECONDS_PER_DAY在两者之间进行转换,宏定义如下:

代码语言:javascript
复制
-define(SECONDS_PER_DAY, 86400).
-define(DAYS_FROM_0_TO_1970, 719528).

有关示例the implementation of calendar:now_to_datetime/1,请参阅。

票数 4
EN

Stack Overflow用户

发布于 2017-01-12 20:28:42

找到答案了!

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

因此,它将所有内容都匹配到匹配(‘$end_of_table’,-> ) Acc;

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41612597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档