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;
我想获取参数传入的月份的第一天和最后一天
我尝试使用以下查询,但出现错误。
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;