在 PostgreSQL 视图中显示最近 3 个日历年的记录

Posted

技术标签:

【中文标题】在 PostgreSQL 视图中显示最近 3 个日历年的记录【英文标题】:Display last 3 calendar year records in PostgreSQL view 【发布时间】:2021-09-17 21:37:56 【问题描述】:

我想在 Postgres 视图中显示超过 3 个日历年的记录。如果今天的日期是 2021 年 9 月 17 日,那么最后 3 个日历年是 2018 年。但我只需要考虑年份而不考虑日/月。所以最近 3 个日历年是 2018 年,我需要显示 01/01/2018 的记录。

我可以得到过去 3 年的

select * from table1 where datecolumn >= date_part('year', (now() - '3 year'::interval));

此查询显示 2018 年 9 月 17 日的记录。但我想显示 01/01/2018 的记录。

【问题讨论】:

【参考方案1】:

仅使用日期函数的替代方法,避免隐式日期->双精度->字符串->日期转换。

 select * 
   from table1 
  where datecolumn >= date_trunc('year', (now() - interval '3 years'))::date

【讨论】:

这很好用。谢谢!【参考方案2】:

显然未经测试,但应该可以工作:

select 
   * 
from 
   table1 
where 
  datecolumn >= 
  ('01/01/' || extract('year' from current_date))::date - interval '3 years';

【讨论】:

【参考方案3】:

您可以将时间戳/日期列中的年份部分提取为整数并进行简单比较,例如:

WITH sample AS (
SELECT UNNEST(
   ARRAY[
      '2016-01-01',
      '2017-12-12',
      '2017-02-02',
      '2018-03-03',
      '2019-04-04',
      '2020-05-05'
   ] )::TIMESTAMP AS datecolumn
)
SELECT datecolumn
  FROM sample
 WHERE DATE_PART('YEAR', datecolumn) >= DATE_PART('YEAR', CURRENT_DATE) - 3;

输出:

     datecolumn      
---------------------
 2018-03-03 00:00:00
 2019-04-04 00:00:00
 2020-05-05 00:00:00
(3 rows)

【讨论】:

以上是关于在 PostgreSQL 视图中显示最近 3 个日历年的记录的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL物化视图刷新“堆叠”

是否可以在 PostgreSQL 中部分刷新物化视图?

从超过 1 个表格中选择或创建最近 3 篇文章的视图

PostgreSQL 行级安全性涉及视图或带有连接的选择

如何一次刷新 Postgresql 9.3 中的所有物化视图?

从 Postgresql 视图中获取下一条记录