计算当前学年

时间:2013-05-02 15:41:11

标签: sql oracle11g

我正在尝试根据sysdate来计算当前学年。

由于学年通常从(大约)8月到5月开始,我需要查看当前的月份,以确定我们实际上在哪个学年。

例如,如果当前月份是2013年5月,那么它将是2012-2013学年。但是,如果当前月份是2013年9月,那么它将是2013-2014学年。

我怀疑我的方法已经过时了,并且有一种更容易实现的方法,但这里是我正在使用的sql代码部分:

WHERE to_date(ps_customfields.getStudentscf(s.id,'VolTran_ExpDate'),'MM/DD/YYYY') BETWEEN 

CASE 
    WHEN to_char(sysdate,'MM') < '08' THEN '08/01'||(to_char(sysdate,'YYYY')-1) and '08/01/'||to_char(sysdate,'YYYY') 
    WHEN to_char(sysdate,'MM') >= '08' THEN '08/01'||to_char(sysdate,'YYYY') and '08/01/'||(to_char(sysdate,'YYYY')+1)
END

ps_customfields.getStudentscf(s.id,'VolTran_ExpDate')字段是纯文本字段,这就是我将其作为日期投射的原因。

我在SQLDeveloper中使用此特定代码获得的错误是“ORA-00905:缺少关键字”,但我无法确定我缺少的内容。

任何人都可以建议一种更优雅的方式来实现这个目标吗?

谢谢

3 个答案:

答案 0 :(得分:1)

CASE的结果是值,而不是范围。如果我理解了正确的问题,那么您需要2 CASE s(另外,似乎第二WHEN可以替换为ELSE):

WHERE to_date(ps_customfields.getStudentscf(s.id,'VolTran_ExpDate'),'MM/DD/YYYY') 
BETWEEN     
 CASE 
    WHEN to_char(sysdate,'MM') < '08' THEN '08/01'||(to_char(sysdate,'YYYY')-1) 
    ELSE '08/01'||to_char(sysdate,'YYYY') 
 END
AND
 CASE 
    WHEN to_char(sysdate,'MM') < '08' THEN '08/01/'||to_char(sysdate,'YYYY') 
    ELSE '08/01/'||(to_char(sysdate,'YYYY')+1)
 END

答案 1 :(得分:0)

另一种选择是:

where trunc (add_months (to_date( ps_customfields.getStudentscf (s.id,
                                                               'VolTran_ExpDate'),
                                  'MM/DD/YYYY'),
                         5),
             'YYYY')
      = trunc (add_months (sysdate, 5),
              'YYYY')

换句话说,在两个日期中添加5个月并比较年份。在1月至7月增加5个月的日期不会改变年份,但是在8月到12月的日期中增加5个月会移到下一学年。

说实话,CASE解决方案更容易理解,我提供这只是为了完整性!

答案 2 :(得分:0)

@ a1ex07

您的解决方案效果很好!我只需要将它的部分内容重新制作,所以最终的版本是:

WHERE to_date(ps_customfields.getStudentscf(s.id,'VolTran_ExpDate'),'MM/DD/YYYY') 
BETWEEN     
    CASE 
        WHEN to_char(sysdate,'MM') < '08' THEN to_date('08/01/'||(to_char(sysdate,'YYYY')-1) , 'MM/DD/YYYY')
        ELSE to_date('08/01'||to_char(sysdate,'YYYY'), 'MM/DD/YYYY')
    END
AND
    CASE 
        WHEN to_char(sysdate,'MM') < '08' THEN to_date('08/01/'||to_char(sysdate,'YYYY'), 'MM/DD/YYYY')
        ELSE to_date('08/01/'||(to_char(sysdate,'YYYY')+1), 'MM/DD/YYYY')
    END