我写了一个查询来提取日期之间的小时数。这基本上将检索员工的时间条目。当我执行以下查询时,它工作正常,但是当我添加提取功能时,出现错误:
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
如何更改提取功能以得到相同的结果。提取函数是否可以提供相同的结果?
您可以使用以下方法轻松找到两个日期之间的小时数:
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)
干杯!
嗯,您的LINE_STOP_TIME和LINE_START_TIME是字符串,而不是日期,因此您无法从中提取日期信息。从内联SELECT中删除TO_CHAR,应该没问题。