SQL Запрос на получение первого дня месяца, прошедшего в параметре текущего года - PullRequest
1 голос
/ 28 мая 2020

Я хочу получить первый и последний день месяца, переданного в параметре. Я попробовал запрос -

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'

Ответы [ 3 ]

0 голосов
/ 28 мая 2020

Что-то не так у вас в логах c. Вам не нужно преобразовывать строки в строки. Итак, я думаю:

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.

0 голосов
/ 28 мая 2020

Если вам нужно 20200531 в предложении where, я думаю, вы хотите

select to_char(last_day(to_date(('01'||'May'||'2020'),'DDMMYYYY')), 'YYYYMMDD')
from dual;
0 голосов
/ 28 мая 2020

Внутренний вызов TO_CHAR() - это проблема. Просто используйте TO_DATE() следующим образом с правильным спецификатором формата в качестве второго аргумента:

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

Неясно, является ли параметр полным или сокращенным названием месяца (май в этом отношении неоднозначен). Я предположил, что это первое. Если это короткое имя, используйте вместо него 'DD MON YYYY'.

В вашем запросе:

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