2017-01-12 17 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

变量名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

+0

Yeap。刚刚整理出来。并发布答案。谢谢您的回答 – Qbeck

0

找到了答案!

主要的事情,unixtime和 日历:datetime_to_gregorian_seconds({{2017,1,12},{11,00,00}})是不同的

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