连接和比较字段值作为日期

时间:2018-07-12 08:02:33

标签: sql oracle peoplesoft

您能帮我解决这个问题吗?

我在下面的字段中带有示例值:

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>

  1. 主要问题是,我该怎么做?
  2. 我如何在ACAD_YEAR中获得2018年的18,然后将其加1以得到19?
  3. 我认为我将收到一个无效的类型错误,那么为了使比较合法,我必须将什么转换为to_date?

1 个答案:

答案 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' )显式转换