-1

--inputdate 应该是 'mm/dd/yyyy' 的格式,我需要将它转换为只有 'mm/yyyy'

procedure validatedate(inputdate date)

declare
l_tmpdate varchar2(20);

BEGIN

  if inputdate is NOT NULL then
   BEGIN
   l_tmpdate:=to_char(inputdate ,'mm/yyyy');
   end;
   else
     dbms_output.put_line('Mandatory input should be given--Date should not be NULL');
     RAISE application_error;

//如果日期无效如何执行,即,如果收到的日期格式不是 mm/dd/yyyy 格式,它必须给出类似“给出无效输入”的 msg。

   raise error;
4

2 回答 2

2

由于您的参数已经inputdate是 a date,因此它不能无效*。你说:

在表中存储为 6/19/2007 10:05:00AM(mm/dd/yyyy 格式)的值

日期在内部存储为数字,它们没有格式化。当您查询表中的date值时,客户端会检索该内部表示并根据其设置或您的 NLS_DATE_FORMAT 将其转换为字符串,从而为您提供可识别的内容。

在您正在调用的程序中to_char(input_date),它将始终在有效日期工作,因此您无需检查。但由于您不使用l_tempdate它似乎是一个毫无意义的检查。

如果您将字符串传递给过程并将其转换为日期,那将是另一回事。然后你需要允许和处理无效输入,除非你知道你可以保证你总是会被传递有效值——例如,如果它只从进行验证的应用程序层调用。不过,没有什么是万无一失的。

*嗯,通常;创建无效日期是可能的,但这是一项艰巨的工作,而且几乎可以肯定,您在这里不需要担心什么。

于 2013-11-14T17:56:56.327 回答
1

您没有收到任何日期格式。您会收到一个日期,该日期可以是有效日期,也可以是定义的 NULL。无需检查任何内容(如果需要,NULL 除外)。您可以以您喜欢的任何格式显示日期,无论是“mm/yyyy”还是其他任何格式。

于 2013-11-14T17:56:40.363 回答