ORA-30076:提取源的无效提取字段

问题描述 投票:0回答:1

我写了一个查询来提取日期之间的小时数。这基本上将检索员工的时间条目。当我执行以下查询时,它工作正常,但是当我添加提取功能时,出现错误:

ORA-30076: invalid extract field for extract source



   select emp_id, start_date , stop_date ,
    (ROUND(SUM(

(EXTRACT (DAY FROM line_stop_time - line_start_time)*(3600*24))

+ (EXTRACT (HOUR FROM line_stop_time - line_start_time)*(3600))

+ (EXTRACT (MINUTE FROM line_stop_time - line_start_time)*(60))

+ (EXTRACT (SECOND FROM line_stop_time- line_start_time)*1)

) / (3600), 2) )recorded

from 
(SELECT DISTINCT papf.person_number                          emp_id, 
       ( To_char (sh21.start_time, 'DD-MM-YYYY') ) start_date, 
       ( To_char (sh21.stop_time, 'DD-MM-YYYY') )  stop_date, 
       To_char(sh21.start_time, 'HH24:MI')         line_start_time, 
       To_char(sh21.stop_time, 'HH24:MI')          line_stop_time

FROM   per_all_people_f papf, 
       per_all_assignments_m asg, 
       per_legal_employers ple, 
       hwm_tm_rec sh21, 
       hwm_tm_rec_grp_usages sh22,
       hwm_tm_rec_grp sh23, 
      -- hwm_tm_rec_grp sh29,
       hwm_grp_type sh24, 
       hwm_tm_rep_atrb_usages sh25, 
       hwm_tm_rep_atrbs sh26, 
       hwm_tm_statuses sh27, 
       hwm_tm_status_def_b sh28 
WHERE  papf.person_id = asg.person_id(+) 
       AND asg.legal_entity_id = ple.organization_id 
       AND asg.primary_flag = 'Y' 
       AND asg.assignment_status_type = 'ACTIVE' 
       AND ple.status = 'A' 
       AND Trunc (SYSDATE) BETWEEN papf.effective_start_date AND 
                                   papf.effective_end_date 
       AND Trunc (SYSDATE) BETWEEN asg.effective_start_date AND 
                                   asg.effective_end_date 
       AND Trunc (SYSDATE) BETWEEN ple.effective_start_date AND 
                                   ple.effective_end_date 
       AND papf.person_number = '55' 

       AND sh21.latest_version = 'Y' 
       AND sh21.resource_type = 'PERSON' 
       AND sh21.tm_rec_id = sh22.tm_rec_id 
       AND sh21.tm_rec_version = sh22.tm_rec_version 
       AND sh21.layer_code = 'TIME_RPTD' 
       AND sh22.layer_code = 'TIME_RPTD' 
       AND sh22.tm_rec_grp_id = sh23.tm_rec_grp_id 
       AND sh22.tm_rec_grp_version = sh23.tm_rec_grp_version 
       AND sh23.latest_version = 'Y' 
       AND sh21.resource_id = sh23.resource_id 
       AND sh23.grp_type_id = sh24.grp_type_id 
 --AND sh25.usages_source_id =sum.TM_REC_GRP_ID
       AND sh21.tm_rec_id = sh25.usages_source_id 
       AND sh21.tm_rec_version = sh25.usages_source_version 
       AND sh25.usages_type = 'TIME_RECORD' 
       AND sh24.name = 'Processed TimecardDay' 
       AND sh25.tm_rep_atrb_id = sh26.tm_rep_atrb_id 
       AND sh26.attribute_category IN (SELECT base_element_name 
                                       FROM   pay_element_types_f) 
       AND sh21.resource_id = papf.person_id 
       AND sh21.tm_rec_type IN ( 'RANGE', 'MEASURE' ) 
       AND sh27.tm_status_def_id = sh28.tm_status_def_id 
       AND sh27.tm_bldg_blk_id = sh21.tm_rec_id 
       AND sh27.tm_bldg_blk_version = sh21.tm_rec_version 


ORDER BY papf.person_number,
   ( To_char (sh21.start_time, 'DD-MM-YYYY') ) DESC)
   group by emp_id, start_date , stop_date

如何更改提取功能以得到相同的结果。提取函数是否可以提供相同的结果?

sql oracle
1个回答
0
投票

您可以使用以下方法轻松找到两个日期之间的小时数:

select (end_date - start_date) * 24 from dual;

如果您的列属于timestamp类型,则使用以下内容:

SELECT
    EXTRACT(DAY FROM DIFF) / 24 + 
    EXTRACT(HOUR FROM DIFF) + 
    EXTRACT(MINUTE FROM DIFF) / 60 + 
    ROUND(EXTRACT(SECOND FROM DIFF) / 3600
    ) TOTAL_HOURS
FROM
    (SELECT END_TIMESTAMP - START_TIMESTAMP AS DIFF
       FROM DUAL)

干杯!


0
投票

嗯,您的LINE_STOP_TIME和LINE_START_TIME是字符串,而不是日期,因此您无法从中提取日期信息。从内联SELECT中删除TO_CHAR,应该没问题。

© www.soinside.com 2019 - 2024. All rights reserved.