连接和比较字段的值作为日期
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=] 分别.
- 主要问题是,我该怎么做?
- 如何在 ACAD_YEAR 中得到 2018 年的 18,然后将其加 1 得到 19?
- 我想我会得到一个无效的类型错误,所以我必须将什么转换为 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' )
你能帮我解决这个问题吗?
我在下面有以下字段和示例值:
力量 = 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=] 分别.
- 主要问题是,我该怎么做?
- 如何在 ACAD_YEAR 中得到 2018 年的 18,然后将其加 1 得到 19?
- 我想我会得到一个无效的类型错误,所以我必须将什么转换为 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' )