2017-01-12 2 views
2

Ich habe das Modul, wo ich einige Daten in der ETS-Tabelle speichern Jetzt versuche ich die Daten zu filtern, die die ETS-Tabelle wiederholen, aber immer leer [Liste]. (Dies jedes Mal, wird passend - Matching ('$ end_of_table', Acc) -> Acc;)Wie man ETS-Tabelle ohne ets filtert: 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. 

Kann ich ETS-Tabelle erstellt werden, falsch?

Antwort

4

Die Variablennamen Unix und Unix2 vorschlagen, dass Sie Unix-Zeitstempel sind speichern, dh die Anzahl der Sekunden seit 1970 vergangen, aber die Funktion calendar:datetime_to_gregorian_seconds die Anzahl der Sekunden seit dem Jahr vergangen 0 zurück (siehe documentation). So Ihr Vergleich Unix2 >= FromSec, Unix2 =< ToSec wäre immer falsch.

Das Kalendermodul verwendet den Offset ?DAYS_FROM_0_TO_1970 * ?SECONDS_PER_DAY zwischen den beiden, mit den Makros zu konvertieren wie folgt definiert:

-define(SECONDS_PER_DAY, 86400). 
-define(DAYS_FROM_0_TO_1970, 719528). 

zum Beispiel the implementation of calendar:now_to_datetime/1 See.

+0

Yeap. Ich habe das gerade aussortiert. und posten Sie die Antwort. Vielen Dank für Ihre Antwort – Qbeck

0

Die Antwort gefunden!

die Hauptsache, die Unix-Zeit und Kalender: datetime_to_gregorian_seconds ({{2017,1,12}, {11,00,00}}) sind verschiedene

so ist es alles, um passende ('$ end_of_table' abgestimmt , Acc) -> Acc;