【问题标题】:PostgreSQL: SELECT * from table WHERE timestamp IS WITHIN THIS MONTHPostgreSQL:SELECT * from table WHERE timestamp IS WITHIN THIS MONTH
【发布时间】:2017-06-12 14:34:03
【问题描述】:

出于某种原因,我对如何存档有点迷茫:

SELECT * FROM table WHERE timestamp IS WITHIN THIS MONTH;

我查看了https://www.postgresql.org/docs/9.4/static/functions-datetime.html,但只能向后选择 X 天。

我正在运行 PostgreSQL 9.4

【问题讨论】:

  • 所以你的表只有12个月的数据;还是 2017 年 1 月和 2016 年 1 月应包含在结果中?

标签: sql postgresql postgresql-9.4


【解决方案1】:
... WHERE date_trunc('month', timestamp)
        = date_trunc('month', current_timestamp);

或者:

... WHERE timestamp >= date_trunc('month', current_timestamp)
      AND timestamp <  date_trunc('month', current_timestamp) + INTERVAL '1 month';

第二个版本可以在timestamp 上使用索引,第一个版本需要在表达式date_trunc('month', timestamp) 上使用一个索引。

【讨论】:

  • 是否可以比较“时间戳>本月”。
  • 构建一个字符串,使其成为当前月份的有效日期,然后将其转换为日期。
  • 类似WHERE timestamp &gt; to_date('2017-' ||date_trunc('month', current_timestamp) || '-01','YYYY-MM-DD')
  • @MichaelNielsen 我不明白这个月的时间戳>
  • 我可以使用 to_char(current_timestamp, 'YYYY-MM'); 获取年份和月份,但尝试获取 unix 时间戳失败:选择 to_timestamp(to_char(current_timestamp, 'YYYY-MM' ));
【解决方案2】:

你为什么不用 between 过滤月份?
将本月初作为变量 1,将本月末作为变量 2...

SELECT * FROM table WHERE 
timestamp >= __month_start AND timestamp < __next_month_start

例如

SELECT * FROM table 
WHERE 
(
    timestamp >= '20170701'::timestamp 
    AND 
    timestamp < '20170801'::timestamp
)

与在 where 子句中使用函数不同,这保持了可搜索性。

【讨论】:

    【解决方案3】:

    Laurenz Albe 建议的内容将起作用,但是您将受到性能损失,因为您将失去该字段的基数,您要么必须索引要查询的表达式(显然 PostgreSQL 允许这样做:https://www.postgresql.org/docs/current/static/indexes-expressional.html) 或创建一个单独的列来存储 yyyy-mm 值并进行查询。

    【讨论】:

    • 时间戳列已编入索引,但是,我不确定我是否完全理解您的评论。你能详细说明一下吗?
    • @MichaelNielsen 当然可以,如果您不直接查询字段并在其上应用某种函数(大写,如本例中的 date_trunc),RDBMS 将不会在该字段上使用索引,所以我的建议是在字段上创建一个您要使用的表达式的索引,或者创建一个专用字段以获得更好的性能。
    • @eurotrash 我同意,这也是一种方法!
    • 我也有 unix_timestamp 列,它们是索引的。是否可以执行 unix_timestamp > some_conversion_to_1st_of_month(current_timestamp) 快速有效的操作。
    • 或许,unix_timestamp > to_timestamp(to_char(current_timestamp, 'YYYY-MM'), 'YYYY-MM') ?
    猜你喜欢
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    相关资源
    最近更新 更多