Oracle 此函数用于计算两个日期之间的假期数,有什么问题?

Oracle 此函数用于计算两个日期之间的假期数,有什么问题?,oracle,function,date,oracle-sqldeveloper,sql-function,Oracle,Function,Date,Oracle Sqldeveloper,Sql Function,我不熟悉创建Oracle函数。这个函数有什么问题 create or replace FUNCTION count_holidays( t_date DATE, p_date DATE) RETURN NUMBER IS return_dt NUMBER; BEGIN SELECT COUNT(DISTINCT dated) FROM holiday_new WHERE TRUNC(dated) IN (

我不熟悉创建Oracle函数。这个函数有什么问题

create or replace
FUNCTION count_holidays(
      t_date DATE,
      p_date DATE)
    RETURN NUMBER
  IS
    return_dt NUMBER;
  BEGIN
    SELECT COUNT(DISTINCT dated)
    FROM holiday_new
    WHERE TRUNC(dated)     IN
      (SELECT TRUNC(t_date) + level - 1 
      from dual
        CONNECT BY level <= TRUNC(p_date)-TRUNC(t_date) + 1
      )
    INTO return_dt
    FROM dual;
    RETURN return_dt;
  END;
错误:

错误9,5:PL/SQL:SQL语句被忽略 错误16,5:PL/SQL:ORA-00933:SQL命令未正确结束

此查询错误:

SELECT COUNT(DISTINCT dated)
FROM holiday_new
WHERE TRUNC(dated) IN
  (    SELECT TRUNC(t_date) + level - 1 
       from dual
       CONNECT BY level <= TRUNC(p_date)-TRUNC(t_date) + 1
  )
INTO return_dt
FROM dual;
我猜这个查询应该是这样的:

SELECT COUNT(DISTINCT dated) INTO return_dt
FROM holiday_new
WHERE TRUNC(dated) IN
  (    SELECT TRUNC(t_date) + level - 1 
       from dual
       CONNECT BY level <= TRUNC(p_date)-TRUNC(t_date) + 1
  );
这是一种非常低效的方法来选择带有某些日期的记录,我将使用以下查询:

SELECT COUNT(DISTINCT dated) INTO return_dt
FROM holiday_new
WHERE dated >= trunc(t_date) AND dated < trunc(p_date + 1);
此查询错误:

SELECT COUNT(DISTINCT dated)
FROM holiday_new
WHERE TRUNC(dated) IN
  (    SELECT TRUNC(t_date) + level - 1 
       from dual
       CONNECT BY level <= TRUNC(p_date)-TRUNC(t_date) + 1
  )
INTO return_dt
FROM dual;
我猜这个查询应该是这样的:

SELECT COUNT(DISTINCT dated) INTO return_dt
FROM holiday_new
WHERE TRUNC(dated) IN
  (    SELECT TRUNC(t_date) + level - 1 
       from dual
       CONNECT BY level <= TRUNC(p_date)-TRUNC(t_date) + 1
  );
这是一种非常低效的方法来选择带有某些日期的记录,我将使用以下查询:

SELECT COUNT(DISTINCT dated) INTO return_dt
FROM holiday_new
WHERE dated >= trunc(t_date) AND dated < trunc(p_date + 1);