我正在尝试查询我的postgresql数据库以返回日期在某个月份和年份的结果。换句话说,我想要一个月的所有价值观。
到目前为止我能够做到的唯一方法就是这样:
SELECT user_id
FROM user_logs
WHERE login_date BETWEEN '2014-02-01' AND '2014-02-28'
问题在于我必须在查询表之前计算第一个日期和最后日期。有更简单的方法吗?
谢谢
答案 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。