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

Concatenating and comparing values of fields as date

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

我在下面有以下字段和示例值:

力量 = 1171

TERM_BEGIN_DT = 2018 年 9 月 1 日

TERM_END_DT = 2019 年 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-”进行硬编码,并将每个与 [=] 的“18”和“18”+ 1 连接起来43=] 分别.

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

您可以使用 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' )