我在写一个按月,年和医生的身份返回的功能时遇到了一些问题,他所做的咨询次数。
问题是:作为约会,我有任何医生的咨询,所以我不知道如何使用它来按一年的时间对他所进行的咨询进行排序。
我必须写一个函数,它返回医生访问给定月份的次数。该功能将医生标识符作为参数 一个月和一年。
以下是咨询表:
CREATE TABLE consultation(
n_med integer constraint fk_consultation_medecin references medecin(n_med),
n_malade integer constraint fk_consultation_malade references
malade(n_malade) on delete cascade deferrable initially deferred,
date_consult date,
h_consult integer not null,
prescription varchar2(128),
examen varchar2(128),
constraint pk_consultation primary key(n_med, n_malade, date_consult)
);
这是函数:
FUNCTION getNbConsult(id_med IN integer, mois IN integer, annee IN integer)
RETURN integer
IS
nbConsult integer;
BEGIN
select count(*) into nbConsult from consultation where N_MED = id_med and date_consult = EXTRACT(MONTH FROM DATE ???)
RETURN nbConsult;
END;
/
答案 0 :(得分:1)
您可以使用to_char(date_consult,'YYYYMM') = TO_CHAR( annee, 'FM0000' ) || TO_CHAR( mois, 'FM00' )
但是Oracle将无法在date_consult
列上使用索引(并且需要基于函数的索引),而是可以使用:
FUNCTION getNbConsult(id_med IN integer, mois IN integer, annee IN integer)
RETURN integer
IS
nbConsult integer;
month DATE := TO_DATE( TO_CHAR( annee, 'FM0000' ) || TO_CHAR( mois, 'FM00' ), 'yyyymm' );
BEGIN
SELECT count(*)
INTO nbConsult
FROM consultation
WHERE date_consult >= month
AND date_consult < ADD_MONTHS( month, 1 );
RETURN nbConsult;
END;
/
答案 1 :(得分:0)
不知道您的情况如何指定年份和月份,但您可以选择特定年份和月份的记录,如下所示:
select count(*)
into nbConsult
from consultation
where to_char(date_consult,'YYYYMM') = '201709';
啊,整数。所以你可以把它改成
select count(*)
into nbConsult
from consultation
where to_char(date_consult,'YYYYMM') = annee||lpad(mois,2,'0');