日期范围之间的Postgresql查询

时间:2014-04-28 08:20:48

标签: sql postgresql date between

我正在尝试查询我的postgresql数据库以返回日期在某个月份和年份的结果。换句话说,我想要一个月的所有价值观。

到目前为止我能够做到的唯一方法就是这样:

SELECT user_id 
FROM user_logs 
WHERE login_date BETWEEN '2014-02-01' AND '2014-02-28'

问题在于我必须在查询表之前计算第一个日期和最后日期。有更简单的方法吗?

谢谢

5 个答案:

答案 0 :(得分:145)

如果您使用>= start AND < end,则日期(和时间)会变得更简单。

例如:

SELECT
  user_id
FROM
  user_logs
WHERE
      login_date >= '2014-02-01'
  AND login_date <  '2014-03-01'

在这种情况下,您仍然需要计算所需月份的开始日期,但这应该可以通过多种方式直接进行。

结束日期也简化了;只需添加一个月。没有搞乱28,20,31等等。


这种结构还具有能够维持索引使用的优点。


许多人可能会建议使用以下表单,但 使用索引:

WHERE
      DATEPART('year',  login_date) = 2014
  AND DATEPART('month', login_date) = 2

这涉及计算表中每一行(扫描)的条件,而不是使用索引来查找将匹配的行范围(范围搜索)。

答案 1 :(得分:35)

支持PostreSQL 9.2 Range Types。所以你可以这样写:

SELECT user_id
FROM user_logs
WHERE '[2014-02-01, 2014-03-01]'::daterange @> login_date

这应该比字符串比较

更有效

答案 2 :(得分:5)

以防万一有人降落……从8.1开始,您可以简单地使用:

SELECT user_id 
FROM user_logs 
WHERE login_date BETWEEN SYMMETRIC '2014-02-01' AND '2014-02-28'

从文档中

  

BETWEEN SYMMETRIC与BETWEEN相同,除了没有   要求AND左边的参数小于或等于   右边的论点。如果不是,则这两个参数为   自动交换,因此总是隐含一个非空范围。

答案 3 :(得分:0)

SELECT user_id 
FROM user_logs 
WHERE login_date BETWEEN '2014-02-01' AND '2014-03-01'

Between关键字在某个日期特别有效。假设日期时间为00:00:00(即午夜)。

答案 4 :(得分:-8)

阅读文档。

http://www.postgresql.org/docs/9.1/static/functions-datetime.html

我使用了类似的查询:

WHERE
(
    date_trunc('day',table1.date_eval) = '2015-02-09'
)

WHERE(date_trunc('day',table1.date_eval) >='2015-02-09'AND date_trunc('day',table1.date_eval) <'2015-02-09')    

Juanitos Ingenier。