从pl / sql中提取日期

时间:2017-09-26 11:44:33

标签: sql oracle

我在写一个按月,年和医生的身份返回的功能时遇到了一些问题,他所做的咨询次数。

问题是:作为约会,我有任何医生的咨询,所以我不知道如何使用它来按一年的时间对他所进行的咨询进行排序。

我必须写一个函数,它返回医生访问给定月份的次数。该功能将医生标识符作为参数 一个月和一年。

以下是咨询表:

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; 
/ 

2 个答案:

答案 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');