0
votes

Comment obtenir le numéro de mois en utilisant les conditions d'Oracle

J'ai la requête ci-dessous dans laquelle pour certains Security_Typ CODE> Field, je reçois la valeur correcte à partir du nom de mois pour champ Nom code> mais quelques Security_Type code> Champ La valeur ne commence pas à partir du nom de mois ou il n'y a pas de nom de mois prévu dans celui de champ Nom code>. xxx pré>

 Entrez la description de l'image ici p>

Maintenant, je veux définir la valeur dans le champ Monat code> Le numéro Type de données de telle sorte que si la valeur commence à partir de champ Nom code> est le nom de mois de janvier à décembre, puis définissez-le sur leur numéro de mois par exemple si le nom du démarrage est d'août, définissez-le ensuite sur 8. P >

Si le nom de départ n'est pas de mois à partir de janvier, puis que vous puissiez voir pour Securtiy_typ code> 'Option d'index financier' puis prenez le mois de champ opt_expirs_dt et définissez-le dans monat Champ. P>

Actuellement dans ma requête Sélectionner J'utilise ci-dessous condition pour obtenir le numéro de mois à partir de Nom CODE> champ et le réglage pour champ Monat Code> et je veux modifier cette requête SELECT: P>

Select to_number(TO_CHAR(to_date(UPPER(SUBSTR(name, 0, instr(name,' ', 1, 1) - 1)),'MONTH',
    'NLS_DATE_LANGUAGE = American'),'MM')) monat from BB_EQUOPT_IMPORT


7 commentaires

Avoir le résultat souhaité aiderait beaucoup.


J'ai ajouté le résultat souhaité


Quelle version d'Oracle utilisez-vous?


J'utilise oracle 18c


le nom du mois est en fait je n'utilise pas dans ma table ... c'est juste pour montrer le résultat que je mets là


La colonne NAME peut-elle contenir un mois valide différent du mois de Opt_Expiry_Date? Dans votre exemple de données, ce n'est jamais le cas, vous pouvez donc TOUJOURS Extraire le mois de Opt_Expiry_Date.


Oui, il suffit d'extraire le mois de opt_expiry_date


3 Réponses :


2
votes
SELECT CASE WHEN UPPER(SUBSTR(name, 0, instr(name,' ', 1, 1) - 1)) NOT IN ('JANUARY', 'FEBRUARY', 'MARCH', 'APRIL', 'MAY', 'JUNE', 'JULY', 'AUGUST', 'SEPTEMBER','OCTOBER','NOVEMBER','DECEMBER') 
      THEN TO_NUMBER(TO_CHAR(opt_expiry_date, 'MM')) 
      ELSE 
         DECODE(UPPER(SUBSTR(name, 0, instr(name,' ', 1, 1) - 1)), 'JANUARY', 1, 'FEBRUARY', 2, 'MARCH', 3, 'APRIL', 4, 'MAY', 5, 'JUNE', 6, 'JULY', 7, 'AUGUST', 8, 'SEPTEMBER', 9, 
                      'OCTOBER', 10, 'NOVEMBER', 11, 'DECEMBER', 12, -1) END as MONAT
FROM bb_equoptimport

5 commentaires

Je reçois -1 en conséquence, ce qui n'est pas un numéro de mois valide et non dans le champ Nom, la valeur vient par exemple "janvier x45to" et c'est pourquoi je vérifie la première chaîne de ce champ si ce n'est son nom de mois ou non


Utilisation: supérieure (substruisement (nom, 0, instrtr (nom (nom, '', 1, 1) - 1)) Pour le champ Nom comme dans votre exemple.


Merci son travail mais juste un petit changement peut vous s'il vous plaît utiliser nls_date_language = américain comme je l'ai mentionné dans ma requête SELECT, car il est très important car je reçois des données d'America et Opt_Expiry_date champ est de la date de la date, alors pourquoi to_char?


Cette solution est déjà valable pour l'Amérique, je fais de la première fois à extraire le mois à compter de la date, vous ne pouvez pas faire: to_number (sysdate, 'mm') directement, vous pouvez également utiliser l'extrait comme les autres utilisateurs.


Une seule question sera-t-elle un problème de performance que j'utilise cette logique en vue? J'ai comme 1935486 rangées dans cette vue



4
votes

Vous pouvez utiliser une expression de cas pour décider quelle colonne obtenir la valeur du mois de: xxx pré>

ou: p>

with BB_EQUOPT_IMPORT (name, security_typ, opt_expiry_dt) as (
  select 'JANUARY FOO', 'Equity Option', date '2020-01-20' from dual
  union all
  select 'MAY BAR', 'Equity Option', date '2020-05-18' from dual
  union all
  select 'MICEX', 'Financial index option.', date '2019-11-21' from dual
  union all
  select 'SX5E', 'Financial index option.', date '2020-12-18' from dual
)
select name, security_typ, opt_expiry_dt,
  extract(month from
    coalesce(
      to_date(substr(name, 1, instr(name, ' ') - 1) default null on conversion error,
        'MONTH', 'NLS_DATE_LANGUAGE=ENGLISH'),
      opt_expiry_dt
    )
  ) as monat
from BB_EQUOPT_IMPORT;

NAME        SECURITY_TYP            OPT_EXPIRY      MONAT
----------- ----------------------- ---------- ----------
JANUARY FOO Equity Option           2020-01-20          1
MAY BAR     Equity Option           2020-05-18          5
MICEX       Financial index option. 2019-11-21         11
SX5E        Financial index option. 2020-12-18         12


3 commentaires

Ceci est codé dur et j'ai des milliers d'options de nom différentes qui ne commencent pas à partir du nom de mois lui-même


Je n'utilise que le nom du tout pour "Option de capitaux propres". Ou voulez-vous dire qu'il y a beaucoup de valeurs Security_TyP qui pourraient avoir des noms de mois, pas seulement celui-là? Encore trop nombreux pour énumérer dans l'expression de cas? J'ai ajouté un moyen convivial de 18 jours de ne pas avoir besoin de connaître les noms et de compter sur la conversion de défaillance ...


@Andrew - La requête d'erreur de conversion J'ai ajouté est probablement le moyen le plus simple de le faire pour 18 ° C (ou 12CR2, cela ne fonctionne pas avant cela) - Si Vous devez réellement regarder ce mois-ci à tout. Il ne semble pas que vous ayez besoin de faire, s'il correspond toujours à la date d'expiration du mois de toute façon.



1
votes

Comme vous dites que la colonne Nom ne peut pas contenir un mois valide différent du mois d'opt_expiy_date, vous pouvez ignorer la colonne Nom et simplement extraire le mois à partir de opt_expiry_date:

select name, security_typ, opt_expiry_date, extract(month from opt_expiry_date) as monat
from bb_equopt_import;


0 commentaires