您能帮我解决这个问题吗?
我在下面的字段中带有示例值:
STRM = 1171
TERM_BEGIN_DT = 01-SEPT-18
TERM_END_DT = 19年7月31日
ACAD_YEAR = 2018
*其他信息: 2018/19学年
2018年8月1日– 2019年7月31日*
我想做的是,我想在当前学术年内获得STRM
我想要的SQL是:
SELECT STRM FROM PS_TERM_TBL
WHERE TERM_BEGIN_DT BETWEEN '01-AUG-18' AND '31-JUL-19';
问题是,仅给出上述值,我必须对代码'01 -AUG-'和'31 -JUL-'进行硬编码,并将它们分别与ACAD_YEAR的'18'和'18'+ 1连接。 / p>
答案 0 :(得分:3)
您可以使用ADD_MONTHS
将当前学年开始的纪元日期转换回日历年的开始日期,TRUNC
将值计入年初,然后再次使用ADD_MONTHS
反转初始翻译:
SELECT STRM
FROM PS_TERM_TBL
WHERE TERM_BEGIN_DT >= ADD_MONTHS( TRUNC( ADD_MONTHS( SYSDATE, -7 ), 'YYYY' ), 7 )
AND TERM_BEGIN_DT < ADD_MONTHS( TRUNC( ADD_MONTHS( SYSDATE, -7 ), 'YYYY' ), 19 )
顺便说一句,'01-AUG-18'
不是日期-它是字符串文字,Oracle正在使用NLS_DATE_FORMAT
会话参数将其隐式转换为日期(根据用户的使用情况,该参数可以更改)地区和用户也可以更改自己的会话设置,因此不应依赖其提供一致的格式模型)。如果要指定日期,则应使用以下任一方法:
DATE '2018-08-01'
;或TO_DATE( '01-AUG-18', 'DD-MON-RR', 'NLS_DATE_LANGUAGE = American' )
显式转换