我找到了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
我不知道这是否是正确的语法,或者即时通讯是否针对情况使用了正确的功能
答案 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
。