选择给定序号中的值

时间:2018-01-30 02:49:27

标签: sql postgresql select sequence generate-series

我想写一个查询来检索用户' 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'"在第一行。有人会建议我如何修改我的查询吗?

已阅读:

1 个答案:

答案 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()生成时间戳。考虑: