1

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

由于学年通常从(大约)八月到五月,我需要查看当前月份是什么,以确定我们实际在哪个学年。

例如,如果当前月份是 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:缺少关键字”,但我无法确定我缺少的内容。

任何人都可以提出一个更优雅的方式来完成这个吗???

谢谢你

4

3 回答 3

1

结果CASE是一个值,而不是范围。如果我理解正确的问题,您需要 2 CASEs(另外,似乎 secondWHEN可以替换为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
于 2013-05-02T15:50:06.060 回答
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
于 2013-05-02T16:21:45.970 回答
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 解决方案更容易理解,我提供这个只是为了完整性!

于 2013-05-02T16:09:31.403 回答