我想查询我的PostgreSQL数据库,以返回某个月份和年份的日期结果。换句话说,我想要一个月-年的所有值。
到目前为止,我唯一能做到的是这样:
SELECT user_id
FROM user_logs
WHERE login_date BETWEEN '2014-02-01' AND '2014-02-28'
问题在于我需要在查询表格之前计算第一个日期和最后一个日期。是否有更简单的方法可以做到这一点?
谢谢。
我想查询我的PostgreSQL数据库,以返回某个月份和年份的日期结果。换句话说,我想要一个月-年的所有值。
到目前为止,我唯一能做到的是这样:
SELECT user_id
FROM user_logs
WHERE login_date BETWEEN '2014-02-01' AND '2014-02-28'
问题在于我需要在查询表格之前计算第一个日期和最后一个日期。是否有更简单的方法可以做到这一点?
谢谢。
如果您使用 >= 开始时间 AND < 结束时间
,在处理日期(和时间)时许多事情会变得更加简单。
例如:
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
这涉及计算表中每一行的条件(扫描),而不是使用索引找到将匹配的行范围(范围查找)。
2014-12-01
和 2015-01-01
。第二种方法也可以进行索引,但这并不容易,我承认 -- EXTRACT()
似乎更兼容。 - pozs从PostgreSQL 9.2开始支持区间类型。所以你可以这样写:
SELECT user_id
FROM user_logs
WHERE '[2014-02-01, 2014-03-01]'::daterange @> login_date
这应该比字符串比较更有效率。
[from, to)
或 (from, to]
这样的范围时,确保左侧或右侧不匹配 equal
情况。 - George Dimitriadis以防有人误入此处...自从8.1版本以来,您可以简单地使用以下方法:
SELECT user_id
FROM user_logs
WHERE login_date BETWEEN SYMMETRIC '2014-02-01' AND '2014-02-28'
文档中指出:
BETWEEN SYMMETRIC与BETWEEN相同,只是左侧的参数不需要小于或等于右侧的参数。如果不是这样,这两个参数会自动交换,以便始终隐含一个非空范围。
2014-02-28 00:00:00
。 - johnsonSELECT user_id
FROM user_logs
WHERE login_date BETWEEN '2014-02-01' AND '2014-03-01'
Between(之间)关键字在日期方面工作得非常好。它假设日期的时间为00:00:00(即午夜)。
请阅读文档。
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')