如何使用PostgreSQL确定上个月的最后一天?

时间:2012-01-20 16:35:12

标签: sql postgresql datetime

我需要查询PostgreSQL数据库以确定属于今天日期和上个月最后一天的记录。换句话说,我想检索2011年12月31日到今天之间的所有内容。此查询将每月重复使用,因此下个月,查询将基于当前日期和2012年1月31日。

我见过this option,但我宁愿避免使用函数(如果可能的话)。

6 个答案:

答案 0 :(得分:14)

两个解决方案包括上个月的最后一天,包括所有“今天”。

对于date列:

SELECT *
FROM   tbl
WHERE  my_date BETWEEN date_trunc('month', now())::date - 1
               AND     now()::date

您可以从date(但不是从timestamp)中减去普通整数值,以减去天数。这是最简单,最快捷的方式。

对于timestamp列:

SELECT *
FROM   tbl
WHERE  my_timestamp >= date_trunc('month', now()) - interval '1 day'
AND    my_timestamp <  date_trunc('day'  , now()) + interval '1 day'

请注意,我使用<运算符来获取第二个条件以获得精确结果(〜“明天之前”)。

我没有在第二个查询中转换为date。相反,我添加interval '1 day',以避免来回转换。

请查看手册中的date / time typesfunctions

答案 1 :(得分:3)

获取上个月/上个月的日期

SELECT (date_trunc('month', now())::date - 1) as last_month_date

结果:2012-11-30

获取上个月/上个月的天数

SELECT DATE_PART('days', date_trunc('month', now())::date - 1) last_month_days

结果:30

答案 2 :(得分:2)

试试这个:

SELECT ...
WHERE  date_field between (date_trunc('MONTH', now()) - INTERVAL '1 day')::date 
                      and now()::date 
       ...

答案 3 :(得分:0)

尝试

select current_date - cast((date_part('day', current_date) + 1) as int)

答案 4 :(得分:0)

http://wiki.postgresql.org/wiki/Date_LastDay获取,并修改为仅返回一个月内的日期

    CREATE OR REPLACE FUNCTION calc_days_in_month(date)
    RETURNS double precision AS
    $$
      SELECT EXTRACT(DAY FROM (date_trunc('MONTH', $1) + INTERVAL '1 MONTH - 1         day')::date);
    $$ LANGUAGE 'sql' IMMUTABLE STRICT;


    select calc_days_in_month('1999-05-01')

返回31

答案 5 :(得分:0)

<强> Reference is taken from this blog:

您可以使用以下功能:

CREATE OR REPLACE FUNCTION fn_GetLastDayOfMonth(DATE)
RETURNS DATE AS
$$
    SELECT (date_trunc('MONTH', $1) + INTERVAL '1 MONTH - 1 day')::DATE;
$$ LANGUAGE 'sql' 
IMMUTABLE STRICT;

示例执行:

SELECT *FROM fn_GetLastDayOfMonth(NOW()::DATE);