我每月运行一次查询以选择 月JAN,FEB,MAR,APR,SEP为基础的数据 十月,十一月,十二月。
可以说我正在2018年2月运行此查询,然后是数据 JAN和FEB的数据应来自当年(2018)和MAR,APR,SEP的数据 OCT,NOV,DEC应来自上一年(2017年)。我如何使用SYSDATE处理此问题。
>SELECT * FROM MY_TABLE WHERE MONTH_NAME
IN ('JAN','FEB','MAR','APR','SEP','OCT','NOV','DEC')
AND
YEAR=TO_CHAR(TRUNC(SYSDATE),'YYYY');
假设我的MONTH_NAME列具有所有月份名称,而YEAR和年份则与记录匹配。
答案 0 :(得分:2)
没有示例数据,很难说出您到底想要什么,但是可能是这样的。
SELECT *
FROM my_table
WHERE month_name IN ( 'JAN', 'FEB', 'MAR', 'APR',
'SEP', 'OCT', 'NOV', 'DEC' )
AND (
( EXTRACT ( MONTH FROM TO_DATE( month_name ,'MON' ) )
<= EXTRACT ( MONTH FROM SYSDATE ) AND YEAR = 2018) OR
( EXTRACT ( MONTH FROM TO_DATE( month_name ,'MON' ) )
> EXTRACT ( MONTH FROM SYSDATE ) AND YEAR = 2017)
)
最好将'NLS_DATE_LANGUAGE = ENGLISH'
添加为TO_DATE
的第3个参数
答案 1 :(得分:0)
如果没有示例数据,我建议采用以下方法:
select add_months(
trunc(sysdate,'mm'),
- level + 1
)
from dual
connect by level <= 12;
此查询将返回过去 11 个月的第一天和当前月份