如何从postgresql中的特定日期获取上个月的日期

时间:2016-08-25 12:50:05

标签: sql postgresql netezza

我的查询中有最大日期,如果最大日期是当前月份,那么我希望始终获得上个月的日期。我怎么能这样做?

例如,今天是20160825。如果最长日期为20160801,那么我想获得20160701。但是,如果最长日期是20160501,那么我只想获得更改 - 20160501

SELECT
    DEFN_DK,
    MAX(SNAPSHOT_MTH) 
FROM myTable 
WHERE TOT_AMT >0
GROUP BY DEFN_DK

3 个答案:

答案 0 :(得分:1)

由于您的SNAPSHOT_MTH列是integer(为什么?),因此您无法使用任何其他非常有用的timestamp功能。所以它回到整数数学,从快照“日期”到整数除法创建一个“月”。这可以通过将其转换为字符串然后将其转换为整数来与CURRENT_DATE进行比较。回归1个月同样需要一些数学。效率不高,但这里有:

SELECT DEFN_DK, 
       CASE max(SNAPSHOT_MTH) / 100
           WHEN tochar(CURRENT_DATE, 'YYYYMM')::int THEN 
               ((max(SNAPSHOT_MTH) / 100) - 1) * 100 + 1
               -- or max(SNAPSHOT_MTH) - 100, if you know it always ends in 01
           ELSE max(SNAPSHOT_MTH)
       END AS SNAPSHOT_MTH
FROM myTable 
WHERE TOT_AMT > 0
GROUP BY DEFN_DK;

答案 1 :(得分:0)

select
    defn_dk,
    case max(snapshot_mth)
        when date_trunc('month', current_date) then max(snapshot_mth) - interval '1 month'
        else max(snapshot_mth)
    end        
from mytable 
where tot_amt >0
group by defn_dk

答案 2 :(得分:0)

显示这两个例子:

select
case when date_trunc('month',dd) = date_trunc('month',now()) 
then dd - interval'1 month' else date_trunc('day',dd) end
from
(
select '2016-08-04'::date as dd
) d;

select
case when date_trunc('month',dd) = date_trunc('month',now()) 
then dd - interval'1 month' else date_trunc('day',dd) end
from
(
select '2016-05-04'::date as dd
) d;