Преобразование eaxdata запроса Teradata в Oracle

#oracle #teradata

#Oracle #teradata

Вопрос:

Мне нужна помощь с преобразованием приведенного ниже SQL-запроса в Taradata в Oracle exadata. Не уверен, как преобразовать дату, я изменил функцию приведения даты На_Date, но получаю несколько ошибок.

 SELECT DISTINCT 
        pat.pat_id,
        pat.pat_mrn_id AS patientmrn,
        pat.pat_name   AS patientname,
        adt_pat_class_c,
        pat.death_date AS deathdate,
        cast(patenc.hosp_admsn_time AS DATE format 'mm/dd/yyyy') AS          
        admitdate,
        cast(patenc.hosp_disch_time AS DATE format 'mm/dd/yyyy') AS 
        dischargedate,
        extract(year FROM acct.adm_date_time)-extract(year FROM 
        pat.birth_date) - CASE WHEN acct.adm_date_time (format 
        'MMDD')CHAR(4)) 
        <pat.birth_date (format 'MMDD') (CHAR(4)) THEN 1 ELSE 0               
        END AS patage,
            adt_billing_type_c,
            adt_patient_stat_c,
            hosp_admsn_type_c,
            acct_basecls_ha_c,
            ordproc.order_proc_id AS order_id,
            ordproc.ordering_date
FROM  patient pat
inner join pat_enc_hsp patenc ON pat.pat_id = patenc.pat_id
inner join hsp_account acct ON acct.prim_enc_csn_id = patenc.pat_enc_csn_id
inner join order_proc ordproc ON acct.prim_enc_csn_id ON 
ordproc.pat_enc_csn_id
inner join clarity_ser ser ON ser.prov_id = ordproc.authrzing_prov_id
inner join identity_ser_id idser ON ser.prov_id=idser.prov_id 
inner join clarity_loc loc ON loc.loc_id = acct.loc_id
inner join zc_loc_rpt_grp_7 grp7 ON loc.rpt_grp_seven = grp7.rpt_grp_seven
WHERE grp7.name = 'AB'
AND cast(patenc.hosp_disch_time AS DATE format 'mm/dd/yyyy') >= '01/01/2019'
AND admit_conf_stat_c IN (1,4)
AND description LIKE '%CULTURE%'
AND ordproc.lab_status_c = 3
AND adt_pat_class_c IN ('1204','12113')
AND result_time > patenc.hosp_disch_time;
  

Я изменил верхнюю часть запроса (ту, в которой указаны даты) —

 select distinct
   pat.pat_id,
   pat.PAT_MRN_ID as PatientMRN,
   pat.PAT_NAME as PatientName,
   ADT_PAT_CLASS_C,
   pat.DEATH_DATE as DeathDate,
   TO_DATE(patenc.HOSP_ADMSN_TIME, 'mm/dd/yyyy') as AdmitDate,
   TO_DATE(patenc.HOSP_DISCH_TIME, 'mm/dd/yyyy') as DischargeDate----
  

Я получаю следующие ошибки —
ORA-12801: ошибка, сигнализируемая на параллельном сервере запросов P02G, экземпляр nzcladb01xm.nndc.kp.org: CDB001N41 (1)
ORA-01843: неверный месяц
12801. 00000 — «ошибка, о которой сигнализирует сервер параллельных запросов % s»
* Причина: сервер параллельных запросов достиг состояния исключения.
* Действие: Проверьте причину следующего сообщения об ошибке и обратитесь к
ваше руководство по исправлению ошибок для соответствующего действия.
* Комментарий: Эта ошибка может быть устранена с помощью события 10397, в котором
вместо этого выдается фактическая ошибка сервера.

Комментарии:

1. Какие ошибки вы получили? И какой запрос вам удалось получить на данный момент?

2. Спасибо, что спросили. Я получаю следующие ошибки — ORA-12801: ошибка, сигнализируемая на сервере параллельных запросов P02G, экземпляр nzcladb01xm.nndc.kp.org: CDB001N41 (1) ORA-01843: недопустимый месяц 12801. 00000 — «ошибка, сигнализируемая на сервере параллельных запросов % s» * Причина: сервер параллельных запросов достиг состояния исключения. * Действие: Проверьте причину следующего сообщения об ошибке и обратитесь к руководству по исправлению ошибок для соответствующего действия. * Комментарий: Эту ошибку можно отключить с помощью события 10397, и в этом случае вместо этого выдается сигнал о фактической ошибке сервера.

3. Я изменил верхнюю часть запроса (ту, в которой указаны даты) — выберите отдельный pat.pat_id, pat. PAT_MRN_ID как PatientMRN, pat. PAT_NAME как PatientName, ADT_PAT_CLASS_C, pat. ДАТА СМЕРТИ как DeathDate, TO_DATE(patenc.HOSP_ADMSN_TIME, ‘мм/ дд/гггг’) как AdmitDate, TO_DATE (patenc.HOSP_DISCH_TIME, ‘мм / дд/гггг’) как DischargeDate,

4. Определенно существует несоответствие между значением столбца и форматом даты, о чем свидетельствует ошибка ‘ORA-01843: неверный месяц’. Пожалуйста, проверьте еще раз значения в таблице и все ли они соответствуют заданному формату. Кроме того, у вас есть преобразование даты в вашем предложении ‘where’ и извлечение в списке выбрать столбцы. Проверьте их также, удалите эти преобразования и попробуйте выполнить свой запрос снова.

5. Есть еще одна часть, связанная с вычислением даты, patage , это странное вычисление возраста, вероятно, в Oracle trunc(months_between(acct.adm_date_time, pat.birth_date))