将表示日期的字符串传递给Ecto中的postgres查询

use*_*259 4 elixir ecto

试图执行这个postgres查询:

select date('2015-10-05') from posts;
Run Code Online (Sandbox Code Playgroud)

我将日期作为字符串传递:

Ecto.Adapters.SQL.query!(
  Repo, "select date('$1') from posts", ["2015-10-05"])  
Run Code Online (Sandbox Code Playgroud)

但是得到日期时间格式无效的错误.

** (Postgrex.Error) ERROR (invalid_datetime_format): 
  invalid input syntax for type date: "$1"

[debug] select date('$1') from posts ["2015-10-05"]
  ERROR query=0.6ms
    (ecto) lib/ecto/adapters/sql.ex:172: Ecto.Adapters.SQL.query!/5
Run Code Online (Sandbox Code Playgroud)

但是,我不是将它作为日期传递,而是作为字符串传递.Postgres的date()函数也接受字符串,AFAIK,当我添加::varchar以确保它是一个字符串时错误仍然相同.有什么建议可以避免这种情况吗?

bra*_*che 6

因此,您希望将其传递到表单中的Ecto {2015, 10, 5}而不是字符串.

Ecto.Adapters.SQL.query(Repo, "SELECT $1::date", [{2015, 10, 5}])
Run Code Online (Sandbox Code Playgroud)

您可以创建一个小帮助函数将字符串转换为该格式:

def string_to_date(str) do
  {_, date} = Ecto.Date.cast(str)
  Ecto.Date.to_erl(date)
end
Run Code Online (Sandbox Code Playgroud)