问题:在EBS中,期间的格式为MON-YY, 是不能用字符“MON-YY”比较日期大小的。
例如以下查询2020年7月到8月的分录数据的SQL就是错误的,有什么解决办法呢?
--错误查询SQL
select * from GL_JE_HEADERS where period_name between 'JUL-20' and 'AUG-20'
方法1: 将字符“MON-YY”转换为日期格式
select to_date('JUL-20', 'MON-YY') from dual;
--报错:ORA-01843:非有效的月份
报错原因:PLSQL客户端使用的中文环境,“JUL”的格式是无法识别的,所以需要在后面添加NLS_DATE_LANGUAGE参数强制规定语言类型。
英文: NLS_DATE_LANGUAGE=AMERICAN
中文: NLS_DATE_LANGUAGE = SIMPLIFIED CHINESE
select to_date('JUL-20', 'MON-YY', 'NLS_DATE_LANGUAGE=AMERICAN') from dual;
--结果会补充上日期,1号:2020/07/01
所以查询2020年7月到8月的分录数据的SQL可以如下:
select *
from GL_JE_HEADERS
where period_name not like 'ADJ%' --调整月ADJ%不是有效的月份
and to_char(to_date(period_name, 'MON-YY', 'NLS_DATE_LANGUAGE=AMERICAN'),'YYYYMMDD')
between to_char(to_date('JUL-20', 'MON-YY', 'NLS_DATE_LANGUAGE=AMERICAN'),'YYYYMMDD')
and to_char(to_date('AUG-20', 'MON-YY', 'NLS_DATE_LANGUAGE=AMERICAN'),'YYYYMMDD')
方法2:GL_PERIOD_STATUSES
EBS中的表GL_PERIOD_STATUSES 有期间名称和期间编号的对应关系,可以用期间编号比较期间大小(调整月也有编号,可以比较)
select period_name, effective_period_num
from GL_PERIOD_STATUSES B
where B.APPLICATION_ID = 101 --總帳會計管理系統
and B.set_of_books_id = 2001 --賬套ID
order by effective_period_num desc