2015-05-13 14 views
6

Kiedy tworzę zapytanie używając ecto w Elixir, nie jestem naprawdę pewny jak porównać czas w "gdzie" klauzuli.Eliksir, ecto, porównaj czas w miejscu gdzie klauzula

W ramach schematu Oświadczam create_at jak :datetime

schema "tenant" do 
    field :id, :integer 
    field :created_at, :datetime 
    # timestamps([{:inserted_at,:created_at}]) 

end 

a część kwerendy jest jak

def sample_query do 
    query = from t in Tenant, 
    where: t.id == 123, 
    where: t.created_at == %Ecto.DateTime{{2015, 4, 27}, {10, 8, 42}}, 
    select: t 
end 

Wydaje się, że

where: t.created_at <= %Ecto.DateTime{{2015, 4, 27}, {10, 8, 42, 0}},

część jest zła Formularz. Czy ktoś może mi powiedzieć, jak to zrobić we właściwy sposób?

PS: o tym, jak do zdefiniowania pola create_at, link poniżej dał mi odpowiedź

Default datetime with Ecto & Elixir

Odpowiedz

7

Nie można utworzyć %Ecto.DateTime{} struct od krotki termin Erlang/czas takiego. Trzeba zrobić:

def sample_query do 
    query = from t in Tenant, 
    where: t.id == 123, 
    where: t.created_at == ^Ecto.DateTime.from_erl({{2015, 4, 27}, {10, 8, 42, 0}}), 
    select: t 
end 

Jeśli wartości czasu idą gdzieś indziej i chcesz stworzyć %Ecto.DateTime{} struct samemu można zrobić:

^%Ecto.DateTime{year: 2015, month: 4, day: 27, hour: 10, min: 8, sec: 42, usec: 0} 

(Zauważ ^)

+0

To pracował !!! ale wydaje się, że muszę zdefiniować 'created_at' jak' timestamps ([{: inserted_at,: created_at}]) 'zamiast' created_at:: datetime' –

+0

To nie działa dla mnie. Nadal dostaję "gdzie nie można rzutować na typ: datetime w zapytaniu" Używam^i konwertuję datę erl na Ecto.DateTime. Ecto.DateTime.from_erl (: calendar.universal_time()) –

+0

@JB: działa po zamianie: kalendarza z poprawną krotką daty? jeśli tak, być może będziesz musiał ocenić: kalendarz i wykonać konwersję typu w innej zmiennej, a następnie^zmienną w klauzuli where. –