簡體   English   中英

如何正確地使用日期參數調用函數?

[英]How to properly call a function with date parameter?

我必須創建一個函數來計算從給定日期出生的人數作為參數。

我有一個名為“人”的表,出生日期寫為“ 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;

但這不起作用。 我收到一條消息,指出參數數量無效或日/月無效。

您的函數有一個date參數,但是您要傳遞一個字符串。 並且在函數中,您正在將已經是日期的參數轉換為日期,這沒有多大意義。 兩者都依靠您的會話NLS_DATE_FORMAT進行隱式轉換。 在功能內,您實際上是在做:

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_FORMAT為YY / MM / DD或RR / MM / DD; 或客戶端設置隱式格式化日期。 它不是那樣存儲的,更改客戶端/會話設置將更改其顯示方式。 您實際上可能將其存儲為格式化的字符串,但這是一個非常糟糕的主意,您的問題暗示它實際上是一個日期。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM