Elixir 如何从当前日期和外部日期实例中获取年份差异

Elixir 如何从当前日期和外部日期实例中获取年份差异,elixir,phoenix-framework,ecto,Elixir,Phoenix Framework,Ecto,假设我有一个Person模型,每个人都有一个生日字段设置为exto.Date列 因此,如果我从数据库中检索到一条表示此模型实例的记录,那么从此人的生日栏中获取其年龄的最佳方法是什么?不确定“最佳方法”,但这是一种方法: 用法如下:(今天是2015年9月27日) 或者,对于今天以外的人工计算: iex(3)> AgeCalc.age(%Ecto.Date{day: 28, month: 9, year: 2000}, {2034, 12, 25}) 34 我使用的是Exto的查询API。我

假设我有一个
Person
模型,每个人都有一个生日字段设置为
exto.Date


因此,如果我从数据库中检索到一条表示此模型实例的记录,那么从此人的
生日
栏中获取其年龄的最佳方法是什么?

不确定“最佳方法”,但这是一种方法:

用法如下:(今天是2015年9月27日)

或者,对于今天以外的人工计算:

iex(3)> AgeCalc.age(%Ecto.Date{day: 28, month: 9, year: 2000}, {2034, 12, 25})
34
我使用的是Exto的查询API。我有一个带有生日列的用户表,正在使用以下查询:

Repo.all(from u in User, select: fragment("age(?)", u.birthday))
该查询返回一个包含字段
,和
。花上几个月的时间,然后在12岁之前进行
div


我喜欢Timex,但使用Postgres自带的
age
功能对我来说似乎更干净、更快捷。

我是这样用长生不老药做的

  def calculate_age(dob) when is_binary(dob)
  def calculate_age(dob) when is_binary(dob) do
    today = Date.utc_today()
    dob = Date.from_iso8601! dob
    today.year - dob.year
  end

有几个用于通用日期/时间计算的库。Timex是我熟悉的一个。我经常使用vanilla Timex-查看我找到的文档,这似乎是一个不错的选择,尽管我自己没有使用过它,根据示例,它可能需要大量的重新加工。它可能更快,然而,您正在引入只针对postgres的SQL,如果您决定迁移到另一个引擎,您的代码将不再工作。当您今年还没有过生日时,它将返回错误的年龄。
Repo.all(from u in User, select: fragment("age(?)", u.birthday))
  def calculate_age(dob) when is_binary(dob)
  def calculate_age(dob) when is_binary(dob) do
    today = Date.utc_today()
    dob = Date.from_iso8601! dob
    today.year - dob.year
  end