PostgreSQL选择最近的六月

时间:2018-10-02 20:51:40

标签: postgresql postgresql-9.6

我试图为6月1日过去的最接近的查询写一段。例如,今天是10/2/2018。如果今天运行查询,则需要使用日期6/1/2018。如果我在2019年5月29日运行它,它仍然需要抢在2018年6月1日。如果我在6/2/2019上运行它,则应该在6/1/2019上运行。如果我在6/2/2022上运行它,则应该抓住6/1/2022,依此类推。

我相信我需要从以下内容开始:

 SELECT CASE WHEN EXTRACT(MONTH FROM NOW())>=6 THEN 'CURRENT' ELSE 'RF LAST' END AS X
 --If month is greater than or equal to 6, you are in the CURRENT YEAR (7/1/CURRENT YEAR)
 --If month is less than 6, then reference back to the last year (YEAR MINUS ONE)

我相信我需要截断日期然后执行操作。我不确定采用哪种方法(如果我应该在时间戳中添加一年(例如“ 6/1/1900”),或者是否应该尝试拆卸日期部分以执行操作。我一直在出错诸如“操作员不存在”之类的尝试。我尝试过的事情包括:

 SELECT (CURRENT_DATE- (CURRENT_DATE-INTERVAL '7 months'))
 --This does not work as it just gives me a count of days.

 SELECT (DATE_TRUNC('month',NOW())+TIMESTAMP'1900-01-01 00:00:00')
 --Variations of this just don't work and generally error out.

2 个答案:

答案 0 :(得分:1)

使用案例表达式来确定您是否需要使用当前年份或上一年(第1个月到第5个月)

case when extract(month from current_date) >= 6 then 0 else -1 end

然后将其添加到从current_date提取的年份中,例如使用to_date()

select to_Date('06' || (extract(year from current_date)::int + case when extract(month from current_date) >= 6 then 0 else -1 end)::varchar, 'mmYYYY');

您也可以在Postgres 9.4+中使用make_date(year int, month int, day int)

select make_date(extract(year from current_date) + case when extract(month from current_date) >= 6 then 0 else -1 end, 6, 1) ;

答案 1 :(得分:0)

  

如果月份低于6,则为年份,减去负6个月。   其他年份,加上6个月。

set datestyle to SQL,MDY;

select 
case when (extract( month from (date::date)))<6 then date_trunc('year',date)-'6 month'::interval 
else date_trunc('year',date)+'6 months'::interval 
end as closest_prev_june,
another_column,
another_column2
from mytable;

但是格式是默认格式,并且假定您有一列名为date的列。

  

如果要使用now()进行此操作,请使用now()更改日期列   功能。