提取与参数日期设置的与财政年度相关的数据

时间:2019-04-30 14:32:17

标签: postgresql

我有一个student_table,在此表中有一列student_financial_aid_type,下一列是date_,所以Student_financial_aid_type的值例如='direct'和date_ 1/04/2018。我使用了CTE表,并且在代码的开头有一个参数date,所以我可以得出当天的学生人数。例如我的参数日期是20/04/2019。

我的财政年度从四月到三月,例如1/04/18-19/31/3。

我的问题是,这表明学生在该财政年度获得了某种形式的经济援助,我将在输出栏中显示“ Y”或“ N”。因此,使用上面的示例,因为日期1/04/2018不在参数日期(20/04/19)的财政年度中,因此它实际上是在上一个财政年度(1/04/18-31/3 / 19),那么我希望在输出列中将其设置为“ N”,因为在参数日期(20/04/19)的财政年度中,该学生未获得任何经济资助。但是,如果我碰巧将参数日期更改为2/06/18,那么学生收到经济援助的日期(18/04/1)则以财务年度为参数日期,因此我的输出列现在将具有“ Y”反映这一点。因此,不管怎么说,它必须是动态的并响应参数日期,因为这是我作为用户将在

时更改的日期。

我尝试使用date_part,并且设法获得了学生收到付款的日期的月份号,从那时起,我一直在考虑将月份号用作衡量该年份的年份的指标,但是我不确定该怎么做。

WITH 
parameter_date as ( 

select '2019-04-26':: date p_date),

student_cohort as (select * from (
SELECT Distinct 
ms.studentid,ss.student_admission_date,ms.graduation_date


FROM master_student_table ms              
left join student_semeter ss on ms.student_id=ss.student_id , 
parameter_date, p 

AND ss.student_admission_date <= p_date -- i.e. began studies less than 
or equal to p_date
AND (ms.graduation_date is null or ms.graduation_date > p_date)) -- i.e. 
student finished studies more than p_date or IS NULL
)x  ),

student_finance as (select * from ( select  date_part('month', st.date_:: 
date)
date_part, st.date_, st.studentid,st.student_financial_aid_type                                                                                                                                                                                                                        
from student_table st
left join student_cohort s on st.studentid = s.studentid
where st.student_financial_aid_type in ('direct' , 'indirect')                                                                                                                      
) x )     


select distinct
s.student_id,                  
s.graduation_date,                 
s.admissiondate_date,                  
sf.date_,
-- this is what I would like it to be -- case when sf.date is in the same 
--financial year as the parameter_date 
--then 'Y'  else 'N' end was_financial_aid_received_in_the_fy,     
sf.date_part                                             

from

cohort s                                     
left join student_finance sf on s.student_id = sf.student_id and 
sf.student_financial_aid_type = 'direct'
left join student_finance sf1 on s.student_id = sf1.student_id and 
sf1.student_financial_aid_type = 'indirect' `   

我希望案例陈述中的输出列'was_financial_aid_received_in_the_fy'为'Y',如果该学生获得经济援助的日期与该parameter_date在同一财年,则为'N'。不是这样

非常感谢您的帮助

1 个答案:

答案 0 :(得分:0)

我认为这个问题基本上可以归结为以下内容:

  1. 给出一个参数日期,找出该日期的财政年度。
  2. 弄清楚本财政年度是否还有其他日期。

这是使用日期范围的好地方,日期范围是我最喜欢的类型之一。我们可以从参数日期算出财政年度,并使用日期范围来表示它。如果参数日期为4月之前,则会计年度应为前一年的4月1日(含)至今年的4月1日(不含)。如果参数日期为4月之后,则会计年度应为今年的4月1日(含)至次年的4月1日(不含)。

这是一个查询,该查询应演示如何执行此操作:

WITH parameter_date as (
  select '2019-04-26'::date p_date
), fiscal_year as (
  select daterange(
        make_date(case when date_part('month', p_date)<4
                       THEN date_part('year', p_date)::int-1
                       ELSE date_part('year', p_date)::int END,
                   4, 1),
        make_date(case when date_part('month', p_date)<4
                        THEN date_part('year', p_date)::int 
                        ELSE date_part('year', p_date)::int+1 END,
                   4, 1),
        '[)') as f_year
  FROM parameter_date
),
test_data as (
  select test_date::date from (values 
    ('2019-04-01'),
    ('2018-04-01'),
    ('2019-03-02'),
    ('2020-12-01'),
    ('2017-05-26'),
    ('2020-02-27'),
    ('2020-04-01')
  ) v(test_date)
)
select test_date, 
       CASE WHEN test_date <@ fiscal_year.f_year THEN 'Y' ELSE 'N' END as in_f_year
from test_data, fiscal_year;
 test_date  | in_f_year
------------+-----------
 2019-04-01 | Y
 2018-04-01 | N
 2019-03-02 | N
 2020-12-01 | N
 2017-05-26 | N
 2020-02-27 | Y
 2020-04-01 | N
(7 rows)