2017-12-04 24 views
0

에 내 코드에서이 기능이 있습니다처리 날짜 시간 정밀도> 6 비약

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 

가 어떻게 msec > 6-digits을 경우를 처리 것입니다.

잘 TDS 농도 라이브러리와 SQLServer에 datetime2(7)에서 데이터를 작품 당기 :

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 

소스 데이터 값은 다음과 같습니다

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]ydomain.com", "mobile1, mobile2", "/eNvuOyr5N6HxgYdz3fK7A==|QHx/sOa3Se0C3ZeLSNtT97SCsuWL11SJeLykms7faGY=", "Administrator", true, false, 
    {{2017, 11, 30}, {18, 37, 26, 2690120}}, true, {{2017, 11, 30}, {0, 0, 0, 0}}, 1]]}} 

하지만 아래에있는 내 코드로 날짜를 처리하는이 예외를 throw : {{2017, 11, 30}, {18, 37, 26, 2690120}}

+0

귀하의 예외는 3 개의 요소가있는 시간 튜플을 표시하지만 소스 데이터 값은 4 개의 요소를 나타냅니다. 올바른 게 뭐야? –

+0

@JonasDellinger 소스 값이 4 개의 요소 인 erlang 시간 형식 –

+0

어떤 이유로 든 Elixir의 오류보고가 단지 3 개의 요소 만 표시합니다. –

답변

1

datetime2(7) 정밀도는 1/10 마이크로 초입니다. 우리는 결과가 정수가 아닌 부동이되도록 div 대신 /의를 사용하여 분할

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() 

: 당신이 마이크로를 얻을 수 (10)에 의해 값을 분할하고 있음을 사용할 수 있도록 NaiveDateTime는 마이크로 초의 정밀도를 지원합니다.

+0

핵심 팀이 NaiveDateTime.from_erl을 디자인하지 않은 이유가 무엇이든! '{0..999999, 0..6} '이상을 처리 할 수 ​​있습니까? VM 지원 : 나노초? –