SQL 查询,用于获取在当前年份的参数中传递的月份的第一天



我想在参数中获取每月的第一天和最后一天。

我尝试使用以下查询,但它出错了。

select LAST_DAY(to_date(to_char(('01'||:P_MONTH||'2020'),'DDMMYYYY'),'YYYYMM'))
FROM DUAL

我想在查询中使用它

select * from
GL_CODE_TAB
where effective_start_date = LAST_DAY(to_date(to_char(('01'||:P_MONTH||'2020'),'DDMMYYYY'),'YYYYMMDD'))

并在表格GL_CODE_TAB搜索我通过的月份的第一天/最后一天,例如,如果我通过"五月">

select * from
GL_CODE_TAB
where effective_start_date = LAST_DAY(to_date(to_char(('01'||'May'||'2020'),'DDMMYYYY'),'YYYYMMDD'))

哪个应该像

select * from
GL_CODE_TAB
where effective_start_date = '20200531'

你的逻辑有些不对劲。 无需将字符串转换为字符串。 所以,我在想:

SELECT LAST_DAY(TO_DATE('01' || :P_MONTH || '2020', 'DDMMYYYY'))
FROM DUAL

模式MM正在寻找一个数字月份。 (您还将格式模式'DDMMYYYY'查询中的两次;我不知道为什么。

碰巧的是,Oracle 将年份默认为当前年份,将月中的某天默认为当前月份。 因此,您甚至不需要弄乱字符串:

SELECT LAST_DAY(TO_DATE(:P_MONTH , 'MM'))
FROM DUAL;

以上假定参数为数值。 如果要处理字符串,则:

SELECT LAST_DAY(TO_DATE('01' || :P_MONTH || '2020', 'DDMONYYYY'))
FROM DUAL

或:

SELECT LAST_DAY(TO_DATE(:P_MONTH , 'MON'))
FROM DUAL;

如果要传递完整的月份名称,请使用MONTH而不是MON

TO_CHAR()的内在呼唤是问题所在。只需按如下方式使用TO_DATE(),并使用正确的格式说明符作为第二个参数:

SELECT LAST_DAY(TO_DATE('01 ' || :P_MONTH || ' 2020'),'DD MONTH YYYY'))
FROM DUAL

目前尚不清楚该参数是完整的月份名称还是缩写的月份名称(May在这方面模棱两可(。我以为是前者。如果这是一个短名称,请改用'DD MON YYYY'

在您的查询中:

SELECT * 
FROM GL_CODE_TAB
WHERE effective_start_date = LAST_DAY(TO_DATE('01 ' || :P_MONTH || ' 2020'),'DD MONTH YYYY'))

如果您需要在 where 子句中20200531,我想您想要

select to_char(last_day(to_date(('01'||'May'||'2020'),'DDMMYYYY')), 'YYYYMMDD')
from dual;

最新更新