我想写一个查询来检索用户' id
birthyear
在当前年份或所有年份从Health_User
表增加-12的CREATE SEQUENCE years MAXVALUE EXTRACT (YEAR FROM current_date) INCREMENT -12;
SELECT id, EXTRACT (YEAR FROM birthyear)
FROM Health_User
WHERE EXTRACT (YEAR FROM birthyear) IN (years);
。以今年为例,它将是出生于2018年,2006年,1994年,1982年的用户...我希望查询足够通用,可以在任何一年使用,而无需重置当前年份。
我的方法如下:
birthyear
Health_User
中的 ProductRow
是 timestamp 日期格式的列(感谢Erwin Brandstetter的提醒),该列始终是一年的1月1日用户出生了。
然而,它返回错误读取:"语法错误在或附近' EXTRACT'"在第一行。有人会建议我如何修改我的查询吗?
已阅读:
答案 0 :(得分:0)
为了查询,您不会创建 。语法也无效,因为您无法将表达式传递给实用程序命令。 (您看到错误的原因。)将在SEQUENCE
DO
语句中使用动态SQL,如下所示:
DO
$$BEGIN
EXECUTE format('CREATE SEQUENCE years MAXVALUE %s INCREMENT -12', EXTRACT(YEAR FROM now()));
END$$;
但不是为了这个目的。请改用generate_series()
:
SELECT u.* -- or just the columns you need
FROM generate_series(0, 12) g -- nobody's older than 144 years ...
JOIN Health_User u ON u.birthyear
= (date_trunc('year', now()) - interval '12 years' * g)::date;
随时动态运作。
此查询可以使用(birthyear)
上的普通索引 - 而原则不能,因为谓词不是"sargable"。
旁白:
birthyear
中的
Health_User
是时间戳格式的列,始终是用户出生年份的1月1日。
应该是date
或普通integer
,而不是timestamp
。
无论哪种方式,请记住date_trunc()
和演员date
也取决于当前时区设置。
您还可以直接使用generate_series()
生成时间戳。考虑: