2017-07-15 4 views
-1

je voudrais résoudre cette requêterequête sur ans

Display id, dates and time of all "LASER" interventions involving only doctors Having less than 30 years.

mais j'ai une erreur:

select i.id, i.data_e_ora

from persona p join medico m

on p.cf=m.cf

join effettua e

on m.cf=e.cf_med

join intervento i

on e.id_int=i.id

where i.tipo='LASER' and p.data_nascita=((sysdate-p.data_nascita)/365)<30

ERROR at line 9: 
ORA-00932: inconsistent datatypes: expected DATE got NUMBER 

table:

CF          NOT NULL CHAR(16) 
NOME            VARCHAR2(30) 
COGNOME           VARCHAR2(30) 
DATA_NASCITA          DATE 
SESSO            CHAR(1) 
+0

Avez-vous lu le message d'erreur? Parce qu'il vous dit exactement ce que vous voulez savoir. La colonne date (p.data_nascita) est stockée sous forme de nombre (probablement un horodatage UNIX) et non une date – Daniel

+0

Vous devriez vraiment éditer votre question pour montrer le schéma de la table. –

Répondre

0

Il vous suffit de fixer le where clause. Il est trop ambitieux:

select i.id, i.data_e_ora 
from persona p join 
    medico m 
    on p.cf = m.cf join 
    effettua e 
    on m.cf = e.cf_med join 
    intervento i 
    on e.id_int = i.id 
where i.tipo = 'LASER' and 
     p.data_nascita > (sysdate - 365.25 * 30); 

Note: Une meilleure façon de soustracteurs ans est de soustraire en fait des années:

where p.data_nascita > sysdate - interval '30' year 
+0

pourquoi vous utilisez: (sysdate - 365.25 * 30); ??? – Rock

+0

@Rock Parce que cette expression sera toujours évaluée il y a 30 ans à la seconde, ce que le PO a demandé. Et c'est pour ça que Gordon pense que c'est trop ambitieux. Bien sûr, s'il y a des milliers de médecins et que la plupart des médecins effectuent des centaines d'interventions laser (traitement de dégénérescence maculaire?) Par an et que les données ne sont pas OLAP sur le serveur de base de données, oui, c'est trop ambitieux. – jeff6times7

+0

facile syntacx existe? – Rock