PostgreSQL 选择最近的 6 月份
PostgreSQL Selecting The Closest Previous Month of June
我正在尝试为抓取最近的 6 月 1 日之后的查询写一篇文章。例如,今天是 10/2/2018。如果我今天 运行 查询,我需要它使用日期 6/1/2018。如果我在 5/29/2019 运行 它,它仍然需要在 6/1/2018 抓取。如果我在 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)
而且我认为我需要 t运行日期然后执行操作。我不确定采用哪种方法(如果我应该在时间戳中添加一年,例如“6/1/1900”,或者我是否应该尝试拆解日期部分以执行操作。我不断收到错误消息诸如 "operator does not exist" 之类的尝试。我尝试过的事情包括:
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.
使用 case 表达式来确定您是需要使用当前年份还是上一年(第 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) ;
If month lower than 6, trunc year and minus 6 months.
Else trunc year and add 6 months.
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;
但是格式是默认的,假设您有一个名为日期的列。
If you want to do this with now(), change date columns with now()
function.
我正在尝试为抓取最近的 6 月 1 日之后的查询写一篇文章。例如,今天是 10/2/2018。如果我今天 运行 查询,我需要它使用日期 6/1/2018。如果我在 5/29/2019 运行 它,它仍然需要在 6/1/2018 抓取。如果我在 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)
而且我认为我需要 t运行日期然后执行操作。我不确定采用哪种方法(如果我应该在时间戳中添加一年,例如“6/1/1900”,或者我是否应该尝试拆解日期部分以执行操作。我不断收到错误消息诸如 "operator does not exist" 之类的尝试。我尝试过的事情包括:
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.
使用 case 表达式来确定您是需要使用当前年份还是上一年(第 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) ;
If month lower than 6, trunc year and minus 6 months. Else trunc year and add 6 months.
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;
但是格式是默认的,假设您有一个名为日期的列。
If you want to do this with now(), change date columns with now() function.