在postgresql中获取上个月的数据

Ili*_*hev 8 postgresql

SELECT *
FROM Conference WHERE date_start ---don't know how to proceed---
Run Code Online (Sandbox Code Playgroud)

如何检查是否date_start已在上个月?谢谢.

a_h*_*ame 26

从当前月份减去一个月,然后将其"截断"到该日期的开头.由于您不希望包含"this"月份的行,因此您还需要为此添加条件

SELECT *
FROM Conference 
WHERE date_start >= date_trunc('month', current_date - interval '1' month)
  and date_start < date_trunc('month', current_date)
Run Code Online (Sandbox Code Playgroud)

date_trunc('month', current_date - interval '1' month)将返回上个月date_trunc('month', current_date)的第一天,并将返回"此"月的第一天.

  • @HarryVangberg:不,不是。`interval '1' month` 完全有效,与 `interval '1 month'` 的作用相同:http://rextester.com/YDDYL97630 (5认同)
  • 上面包含一个重要的错字。它应该是“ INTERVAL'1 MONTH'”,而不是“ INTERVAL'1'MONTH”,它返回长度为0的间隔。 (4认同)

小智 5

SELECT * FROM Conference WHERE date_trunc('month', date_start)=
  date_trunc('month', current_date - interval '1 month')
Run Code Online (Sandbox Code Playgroud)

小心时区

date_trunc('month', (date_start at time zone 'UTC'))
Run Code Online (Sandbox Code Playgroud)

另外,您可以添加索引以使其更快

CREATE OR REPLACE FUNCTION fn_my_date_trunc(period text,
 some_time timestamp with time zone) 
  RETURNS timestamp with time zone
AS
$BODY$
    select date_trunc($1, $2);
$BODY$
LANGUAGE sql
IMMUTABLE;

CREATE INDEX "IdxConferenceDateStart" ON Conference
 (fn_my_date_trunc('month', (date_start at time zone 'UTC')));
Run Code Online (Sandbox Code Playgroud)

是的,当然,您必须在请求中使用声明的函数“fn_my_date_trunc”才能自动使用此索引(并将日期时间转换为时区日期时间)