如何在PostgreSQL中使用age()函数

时间:2018-07-05 14:34:30

标签: postgresql

我找到了postgres教程网站https://www.postgresql.org/docs/9.3/static/functions-datetime.html,我需要有关age函数的帮助,但不确定如何使用它。 我在学生表中有一列称为生日。我需要找到12岁以上的学生。

select ......, age(timestamp 'birthdate') as StudentAge
from students
.....
where StudentAge > 11

我不知道这是否是正确的语法,或者即时通讯是否针对情况使用了正确的功能

2 个答案:

答案 0 :(得分:1)

我认为您的大部分困惑来自对Postgres的丰富类型系统及其使用的语法的不熟悉。

the page on date/time functions中,age函数以两种形式列出。假设您想与“今天”进行比较,则需要具有单个参数的表单:

  

功能:年龄(时间戳)
  返回类型:interval
  说明:减去current_date(午夜)
  示例:age(时间戳'1957-06-13')
  结果:43年8个月3天

因此,您有一个函数,其值类型为timestamp,并返回值类型为interval

该示例显示输入被指定为timestamp '1957-06-13';这只是从硬编码值创建类型timestamp的值的一种方式-就像使用面向对象的语言创建对象一样。在您的查询中,birthdate不是硬编码的值,它是列的名称,因此这不是您想要的语法。如果该列的类型为timestamp,则可以直接使用age(birthdate);如果没有,您可能需要将其转换,例如age(CAST(birthdate AS timestamp))

输出的类型为interval,而不是几年,因此将其与12进行比较不太可能做您想要的。相反,您应该将其与另一个interval值进行比较。与timestamp '1957-06-13'示例类似,您可以编写interval '12 years'直接创建代表12年的interval值。

所以您的比较看起来像age(birthdate) >= interval '12 years'

答案 1 :(得分:0)

我不知道您正在谈论的教程,但是the documentation对于列标签有以下说法:

  

可以为选择列表中的条目分配名称,以进行后续处理,例如在ORDER BY子句中使用或由客户端应用程序显示。

在此处观察后续SELECT列表是在{em> WHERE子句之后(逻辑上)处理的,因此您不能在此处使用列标签

您将不得不重复该表达式。这符合SQL标准。

此外,birthdate不是字符串文字,因此不要引用它。然后删除timestamp