SQL查询获取当年参数中传入的月份的第一天

SQL Query to get the first day of the month passed in the parameter of the current year

我想获取参数传入的月份的第一天和最后一天

我尝试使用以下查询,但出现错误。

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'))

并在 table GL_CODE_TAB 中搜索我过去的月份的 first/last 日,例如如果我通过“五月”

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'

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'))

你的逻辑有问题。您不需要将字符串转换为字符串。所以,我在想:

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

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

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