2017-12-04 6 views
0

Ich habe diese Funktion in meinem Code:Handhabung Datetime Präzision> 6 in Elixir

defp to_date({year, month, day}), do: NaiveDateTime.from_erl!({{year, month, day}, {0, 0, 0}}, {0, 6}) |> NaiveDateTime.to_string() 
    defp to_date({{year, month, day}, {hour, min, sec, msec}}) when msec < 1000000, 
    do: NaiveDateTime.from_erl!({{year, month, day}, {hour, min, sec}}, {msec, 6}) |> NaiveDateTime.to_string() 

    defp to_date(x), do: x 

Wie würden Sie Fälle, wenn msec > 6-digits behandeln.

Ziehen von Daten aus einem SQL Server datetime2(7) mit der Tds Bibliothek funktioniert gut:

iex(45)> r = Tds.Connection.query(:RMASDB, "select * from users where user_id = 1" , []) 
{:ok, 
%Tds.Result{columns: ["user_id", "name", "email", "mobiles", "password", "roles", "active", "reset_required", "last_login", "has_picture", "last_modified", "last_modified_by"], command: nil, num_rows: 1, 
    rows: [[1, "Charles Okwuagwu", "[email protected]", "mobile1, mobile2", "/eNvuOyr5N6HxgYdz3fK7A==|QHx/sOa3Se0C3ZeLSNtT97SCsuWL11SJeLykms7faGY=", "Administrator", true, false, 
    {{2017, 11, 30}, {18, 37, 26, 2690120}}, true, {{2017, 11, 30}, {0, 0, 0, 0}}, 1]]}} 

aber die Verarbeitung die Termine mit meinem Code unten wirft diese Ausnahme:

iex(46)> DB.get(DB.Users, "select * from users where user_id = 1")      
** (ArgumentError) cannot convert {{2017, 11, 30}, {18, 37, 26}} to naive datetime, reason: :invalid_time 
    (elixir) lib/calendar/naive_datetime.ex:549: NaiveDateTime.from_erl!/2 
    (rmas) lib/db.ex:34: DB.to_date/1 
    (elixir) lib/enum.ex:1270: Enum."-map/2-lists^map/1-0-"/2 
    (elixir) lib/enum.ex:1270: Enum."-map/2-lists^map/1-0-"/2 
    (rmas) lib/db.ex:26: anonymous fn/3 in DB._objects/3 
    (elixir) lib/enum.ex:1270: Enum."-map/2-lists^map/1-0-"/2 
    (rmas) lib/db.ex:17: DB.get/3 

Der Quelldaten-Wert ist : {{2017, 11, 30}, {18, 37, 26, 2690120}}

+0

Ihre Exception zeigt ein Zeittupel mit 3 Elementen an, während Ihr Quelldatenwert 4 Elemente angibt. Was ist der richtige? –

+0

@JonasDellinger der Quellwert ist 4 Elemente, es ist ein Erlang Zeit-Format –

+0

Elixirs Fehlerberichterstattung zeigt nur 3 Elemente aus irgendeinem Grund –

Antwort

1

Ein datetime2(7) Feld speichert mit einer Genauigkeit von einer Zehntel einer Mikrosekunde. Ein NaiveDateTime unterstützt nur eine Genauigkeit von Mikrosekunden, so dass Sie den Wert um 10 teilen kann, um die Mikrosekunden zu erhalten und verwenden, die:

defp to_date({{year, month, day}, {hour, min, sec, seven}}), 
    do: NaiveDateTime.from_erl!({{year, month, day}, {hour, min, sec}}, {div(seven, 10), 6}) |> NaiveDateTime.to_string() 

Wir div teilen anstelle von / so dass das Ergebnis eine ganze Zahl ist und nicht ein Schwimmer.

+0

jeder Grund, warum das Kernteam die NaiveDateTime.from_erl nicht entworfen hat! mit mehr als "{0..999999, 0..6}" umgehen? wenn man bedenkt, dass die VM unterstützt: Nanosekunden? –