2014-06-08 2 views
0

Je ne peux pas utiliser MONTHS_BETWEEN, seulement jouer avec DATEs est autorisé, alors je suis ceci:Oracle - Sélection des employés qui ont été embauchés au cours des 20 dernières années

select * from emp 
where ((SYSDATE- hiredate)/(365+1/4-1/100+1/400)) >= ((SYSDATE/(365+1/4-1/100+1/400))-20); 

Je ne comprends pas pourquoi je suis erreur dans

(SYSDATE/(365+1/4-1/100+1/400))-20 

disant qu'il est un type de données non valide "dataTypes incohérents: attendu% s a% s" quand

(SYSDATE-hiredate)/(365+1/4-1/100+1/400) 

i s fonctionne correctement sans erreur, WTF?

PS: un exemple d'utilisation (365 + 1/4-1/100 + 1/400) est avec la date de naissance, pour plus de précision:

((SYSDATE- birth_date)/(365+1/4-1/100+1/400)) >=18 
+0

Peut-être en utilisant 'hiredate> = ADD_MONTHS (sysdate, -12 * 20)' ou des intervalles serait plus clair. – Glenn

+0

Je voudrais essayer quelque chose comme select to_number (sysdate-to_date ('19940610', 'yyyymmdd'))/7305 à partir de dual; puis comparez-le (Note: 20 ans auront toujours un nombre fixe de jours) – user3570335

Répondre

2

sysdate la date actuelle retour précis ou chiffré et le temps. Dans votre second cas de test comme ci-dessous, vous soustrayez deux dates qui renvoient valeur numérique indiquant le nombre de jours entre les deux dates et donc le calcul (la division a été rendue possible).

(SYSDATE-hiredate)/(365+1/4-1/100+1/400) 

Dans votre premier cas de test comme ci-dessous, vous essayez directement de diviser une valeur de type date. vous ne pouvez pas diviser un type de données de date dans Oracle. Au lieu de cela, vous pouvez ajouter une valeur par exemple x (sysdate +x), cela signifie que vous ajoutez x jours à la valeur de la date.

(SYSDATE/(365+1/4-1/100+1/400))-5 

Dans le cas, vous souhaitez convertir le sysdate au numéro que vous pouvez essayer comme ci-dessous

select to_number(to_char(sysdate, 'yyyymmddhh24miss')) from dual; 

qui vous ramènera DATE + TIME comme 20140608165750 pour aujourd'hui.

(OR)

select to_number(to_char(sysdate, 'yyyymmdd')) from dual; 

Résultat sera 20140608 (seule la partie DATE)

0

Selon Oracle sur la soustraction de deux Date types de données que vous obtiendrez un Number type de données. Oracle docs: Reference

donc cette partie de votre requête
((SYSDATE- birth_date)/(365+1/4-1/100+1/400)) >=18 renvoie un nombre, alors que

Dans cette déclaration
(SYSDATE/(365+1/4-1/100+1/400))-5 sysdate est toujours considérée comme une date dataype qui est la raison pour laquelle vous obtenez l'erreur . Vous pouvez utiliser explicitement to_number pour convertir sysdate en nombre.

Editer: Essayez ce ((to_number(to_char(SYSDATE,'DDMMYYYY'))/(365+1/4-1/100+1/400))-5) pour convertir votre dataype de date sysdate en nombre de données. Ainsi, votre requête de sélection devrait ressembler à ceci

select * from emp 
where ((SYSDATE- hiredate)/(365+1/4-1/100+1/400)) >= ((to_number(to_char(SYSDATE,'DDMMYYYY'))/(365+1/4-1/100+1/400))-5); 
+0

select to_number (sysdate) from dual; Obtenir le numéro invalide rerror: S – Alpha2k

+0

Vérifiez ma réponse éditée. –

Questions connexes