我的查询中有最大日期,如果最大日期是当前月份,那么我希望始终获得上个月的日期。我怎么能这样做?
例如,今天是20160825
。如果最长日期为20160801
,那么我想获得20160701
。但是,如果最长日期是20160501
,那么我只想获得更改 - 20160501
。
SELECT
DEFN_DK,
MAX(SNAPSHOT_MTH)
FROM myTable
WHERE TOT_AMT >0
GROUP BY DEFN_DK
答案 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;