2017-04-08 1 views
0

Je suis en train d'interroger pour les commandes d'un magasin et date_trunc son inserted_at en utilisant le fuseau horaire de la boutique.Comment utiliser date_trunc avec fuseau horaire dans la déclaration de fragment Ecto

Ce qui suit a fonctionné.

shop |> Ecto.assoc(:orders) |> select([o], fragment("date_trunc('day', ? at time zone 'America/Los_Angeles')", o.inserted_at)) |> Repo.all 

Mais lorsque je tente de passer dynamiquement dans le fuseau horaire, j'obtiens l'erreur « ne pouvait pas déterminer le type de paramètre de données $ 1 » même si je explicitement utilisé type pour lancer le fuseau horaire en tant que chaîne

shop |> Ecto.assoc(:orders) |> select([o], fragment("date_trunc('day', ? at time zone '?')", o.inserted_at, type(^timezone, :string))) |> Repo.all 


** (Postgrex.Error) ERROR 42P18 (indeterminate_datatype): could not determine data type of parameter $1 
[debug] QUERY ERROR source="orders" db=1.0ms 
SELECT date_trunc('day', o0."inserted_at" at time zone '$1::varchar') FROM "orders" AS o0 WHERE (o0."shop_id" = $2) ["America/Los_Angeles", "QXJnQWw2NWxhS289"] 
    (ecto) lib/ecto/adapters/sql.ex:436: Ecto.Adapters.SQL.execute_and_cache/7 
    (ecto) lib/ecto/repo/queryable.ex:130: Ecto.Repo.Queryable.execute/5 
    (ecto) lib/ecto/repo/queryable.ex:35: Ecto.Repo.Queryable.all/4 

En utilisant elixir 1.4.1 et ecto 2.1.4 ici.

Comment obtenir la bonne requête?

Merci d'avance!

+1

Essayez de supprimer la citation unique autour '?' pour le fuseau horaire: 'fragment (" date_trunc ('jour',? au fuseau horaire?) ", ...)'. – Dogbert

+0

@Dogbert ça a marché! Merci! – he9lin

Répondre

2

Vous n'avez pas besoin des citations dans le SQL autour ? lors de l'utilisation fragment (et non plus besoin que vous la distribution de type explicite après avoir corrigé l'erreur de citation):

shop |> Ecto.assoc(:orders) |> select([o], fragment("date_trunc('day', ? at time zone ?)", o.inserted_at, ^timezone)) |> Repo.all