Sql 如何正确调用带有日期参数的函数?

Sql 如何正确调用带有日期参数的函数?,sql,oracle,date,Sql,Oracle,Date,我必须创建一个函数,作为参数计算从给定日期起出生的人数 我有一张名为Person的表格,上面写着出生日期“YY/MM/DD” 功能如下: create or replace function persons_count(p_date date) RETURN NUMBER IS cnt NUMBER; BEGIN` SELECT COUNT(*) INTO cnt FROM person WHERE date_of_birth > To_Date(p_date,'dd.mm.yy

我必须创建一个函数,作为参数计算从给定日期起出生的人数

我有一张名为Person的表格,上面写着出生日期“YY/MM/DD”

功能如下:

create or replace function persons_count(p_date date) RETURN NUMBER IS cnt NUMBER; 
BEGIN`
  SELECT COUNT(*) INTO cnt FROM person
  WHERE date_of_birth > To_Date(p_date,'dd.mm.yyyy'); 
  RETURN cnt;
END;
我试着运行这个函数:

SET SERVEROUTPUT ON

DECLARE
  num NUMBER;
BEGIN
  num := persons_count('82/11/01');
  dbms_output.put_line(num);
END;

但它不起作用。我收到一条消息,表示参数的数量无效,或者日/月无效。

您的函数接受一个日期参数,但您正在传递一个字符串;在函数中,你将一个已经是日期的参数转换成日期,这没有多大意义。两者都依赖于会话NLS_DATE_格式进行隐式转换。在您有效执行的功能中:

WHERE date_of_birth > To_Date(to_char(p_date, NLS_DATE_FORMAT),'dd.mm.yyyy'); 
在通话中,您正在执行以下操作:

persons_count(to_date('82/11/01', NLS_DATE_FORMAT));
如果幸运的话,您的会话将设置正确,但在这里您依赖的是冲突的格式,因此其中一个将失败或得到意外的答案。您不应该依赖NLS设置,也不应该将日期转换为字符串并返回

你想要的东西更像:

create or replace function persons_count(p_date date)
RETURN NUMBER IS
  cnt NUMBER; 
BEGIN
  SELECT COUNT(*) INTO cnt
  FROM person
  WHERE date_of_birth > p_date;
  RETURN cnt;
END;
尽管您可能确实想要
>=p_date
。然后用明确的日期调用它,例如:

num := persons_count(to_date('1982/11/01', 'YYYY/MM/DD));
(注意四位数年份;即使使用RR格式模型元素,也不要使用两位数年份)或ANSI日期文字:

num := persons_count(DATE '1982-11-01');

我有一张名为Person的表格,上面写着出生日期“YY/MM/DD”


如果列的数据类型为DATE,则它没有内在格式。如果查询该表并看到这样格式的日期值,则NLS_date_格式为YY/MM/DD或RR/MM/DD;或者客户端设置正在隐式格式化日期。它不是那样存储的,更改客户端/会话设置将更改它的显示方式。有可能您实际上将其存储为格式化字符串,但这是一个非常糟糕的主意,您的问题暗示它实际上是一个日期。

如果您要查找自某个特定日期以来有多少人被雇用,为什么要查看他们的DOB?我错了。我在寻找自某个特定日期起出生的人。是的,在表中有一列的数据类型是date。感谢您的帮助,它现在可以工作:)