从pl/sql中提取日期

从pl/sql中提取日期,sql,oracle,Sql,Oracle,我在写一个函数时遇到了一些问题,这个函数按月份、年份和医生的id返回,他做了多少次咨询 问题是:作为一个日期,我有一个医生的任何咨询,所以我不知道如何用它来按一年中每个月的咨询次数排序 我必须写一个函数,返回一个医生在一个月内的就诊次数。该函数将医生标识符作为参数 一月零一年 以下是咨询表: CREATE TABLE consultation( n_med integer constraint fk_consultation_medecin references medeci

我在写一个函数时遇到了一些问题,这个函数按月份、年份和医生的id返回,他做了多少次咨询

问题是:作为一个日期,我有一个医生的任何咨询,所以我不知道如何用它来按一年中每个月的咨询次数排序

我必须写一个函数,返回一个医生在一个月内的就诊次数。该函数将医生标识符作为参数 一月零一年

以下是咨询表:

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

不知道在您的情况下是如何指定年份和月份的,但您可以选择特定年份和月份的记录,如下所示:

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');
您可以使用
to_char(date_consult,'yyyyymm')=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; 
/ 
函数getNbConsult(id_med IN integer,mois IN integer,annee IN integer)
返回整数
是
nbConsult整数;
月份日期:=截止日期(截止字符(annee,'FM0000')|截止字符(mois,'FM00'),'yyyymm');
开始
选择计数(*)
进入nbConsult
咨询
其中日期>=月份
咨询日期<添加月份(第1个月);
返回nbConsult;
结束;
/ 

如果您有一年和一个月,请创建一个日期变量,其中日期部分是该月的第一天。然后是一个简单的
和date\u consult>=这个变量和date\u consult
?从N|MED=id|MED和date|consult>=TO|date(mois | |'/'| | | 1 | |'/'| | annee,'MM/DD/yyyyy')和日期| consult<(mois | | | | | | |'/'| | 31 | | | | | | | |;你在正确的轨道上。您必须将两个整数转换为字符串,在需要时在月份上加一个前导零,并确认并非所有月份都有31天。因此,这里是:从N_MED=id_MED和date_consult>=to_date(to_CHAR(mois)| | | | | | | | | | | | | | | | | | | | | | | | | | | |(TO|CHAR(mois)|/| |/| | 31 | |/| | TO|CHAR(annee),'MM/DD/YYYY');但是我仍然不知道如何检查一个月的最后一天。如果你完全按照我最初的建议去做,那么一个月的最后一天是什么也不重要。虽然这具有简单性的价值,但它可能执行得很慢,因为它会过滤函数结果。那么,你为什么不写一个答案呢?