日期范围之间的 Postgreql 查询

我正在尝试查询 postgreql db,以返回日期在特定月份和年份中的结果。换句话说,我想要一个月年的所有值。

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

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

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

谢谢

381541 次浏览

有了日期(和时间) ,如果使用 >= start AND < end,许多事情会变得更简单。

例如:

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

在这种情况下,您仍然需要计算您需要的月份的开始日期,但这应该是直接的,在任何数量的方式。

截止日期也被简化了,只要加上一个月就可以了,不要再加上28号、30号、31号等等。


此结构还具有能够维护索引使用的优点。


许多人可能会建议使用下面这样的表单,但是 不要使用索引:

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

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

阅读文档。

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')

支持 PostreSQL 9.2 范围类型,所以你可以这样写:

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

这应该比字符串比较更有效

以防有人降落在这里,从8.1开始,你可以简单地使用:

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

来自文件:

除了没有 要求 AND 左边的参数小于或等于 右边的论点。如果不是,那么这两个论点是 自动交换,因此总是暗示非空的范围。

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

它假设日期的时间是00:00:00(也就是午夜)。