2017-04-08 7 views
0

ショップの注文を照会しようとしています。date_truncinserted_atショップのタイムゾーンを使用しています。Ectoフラグメントステートメントでdatezoneをタイムゾーンで使用する方法

以下が機能しました。

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

しかし、私は動的にタイムゾーンを渡すしようとしたとき、私は明示的に文字列

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 
としてタイムゾーンをキャストする typeを使用していてもエラー「パラメータ$ 1のデータ型を特定できませんでした」取得

エリキシル1.4.1およびエクト2.1.4をここで使用する。

どのようにクエリを取得するには?

ありがとうございます!

あなたが fragmentを使用した場合 ?周りのSQLでの引用符を必要としない(どちらもあなたが引用エラーを修正した後、あなたが明示的な型キャストが必要です)はありません
+1

は周りの単一引用符を削除してくださいtimezone: 'fragment(" date_trunc( 'day'、?at time zone?) '、...) 'の'? 'を返します。 – Dogbert

+0

@Dogbertそれは働いた!ありがとう! – he9lin

答えて

2

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