我正在尝试根据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:缺少关键字”,但我无法确定我缺少的内容。
任何人都可以建议一种更优雅的方式来实现这个目标吗?
谢谢
答案 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