Time & Labor

Oracle Fusion Time and Labor Tables Complete Guide

Master the HWM_ schema: timecards, reported times, work schedules, approval workflows, and payroll transfer — with 6 copy-paste SQL queries.

Jun 11, 2026·18 min read·Search 14K+ Tables →

Table of Contents

  1. Time & Labor Module Overview
  2. Core HWM_ Tables Reference
  3. Timecard Processing Flow
  4. Work Schedules & Assignments
  5. OTBI Subject Areas
  6. 6 Production SQL Queries
  7. Payroll Transfer Mapping
  8. Reporting Tips & Gotchas

1. Time & Labor Module Overview

Oracle Fusion Cloud Time and Labor uses the HWM_ prefix (Historical Workforce Management) for its core tables. The module handles employee time entry, approval workflows, time calculation rules, and the transfer of approved hours to payroll for earnings processing.

The architecture splits into three layers:

ℹ️

Access note: In Oracle Fusion Cloud, time data is typically reported through OTBI subject areas (like Workforce Management — Reported Time Real Time) rather than direct SQL. Direct SQL access requires BI Publisher data models or HCM Extracts with appropriate roles.

2. Core HWM_ Tables Reference

Here are the 12 most important Time and Labor tables, grouped by function:

Timecard & Time Entry Tables

TablePurposeKey Columns
HWM_TM_TIME_CARDSTimecard header/summary — one row per timecard submissionTIME_CARD_ID, PERSON_ID, TIMECARD_PERIOD_ID, TIMECARD_STATUS, SUBMITTED_DATE, APPROVED_DATE
HWM_TM_REP_TIMESIndividual time entries (the main detail table) — one row per time blockTIME_ID, PERSON_ID, ASSIGNMENT_ID, TIMECARD_ID, START_DATE, END_DATE, DURATION_HOURS, TIME_CATEGORY_CODE, TIME_APPROVAL_STATUS
HWM_TM_DURATIONSCalculated durations after rule processing (post-rules output)DURATION_ID, TIME_ID, DURATION_MINUTES, SHIFT_TYPE_ID
HWM_TIMECARD_PERIODSTimecard period definitions (weekly, biweekly, semi-monthly boundaries)TIMECARD_PERIOD_ID, PERIOD_START_DATE, PERIOD_END_DATE, PERIOD_STATUS

Work Schedule Tables

TablePurposeKey Columns
HWM_WORK_SCHEDULESWork schedule definitions (8-hour day, 4x10, rotating shifts)WORK_SCHEDULE_ID, WORK_SCHEDULE_NAME, SCHEDULE_START_DATE, SCHEDULE_END_DATE
HWM_WORK_SCHEDULE_ASSIGNMENTSLinks schedules to workers (date-effective)SCHEDULE_ASSIGNMENT_ID, WORK_SCHEDULE_ID, PERSON_ID, ASSIGNMENT_ID, EFFECTIVE_START_DATE, EFFECTIVE_END_DATE
HWM_WORK_SCHEDULE_DETAILSDaily patterns within a schedule (Mon=8h, Tue=8h, etc.)SCHEDULE_DETAIL_ID, WORK_SCHEDULE_ID, DAY_OF_WEEK, START_TIME, END_TIME, SCHEDULED_HOURS

Time Rules & Configuration Tables

TablePurposeKey Columns
HWM_TM_RULE_SETSTime calculation rule sets (overtime thresholds, break rules)RULE_SET_ID, RULE_SET_NAME, RULE_SET_CODE
HWM_TM_RULESIndividual rules within a rule setRULE_ID, RULE_SET_ID, RULE_TYPE, THRESHOLD_HOURS, MULTIPLIER
HWM_TM_TIME_CATEGORIESTime category definitions (Regular, Overtime, Holiday, etc.)TIME_CATEGORY_ID, TIME_CATEGORY_CODE, TIME_CATEGORY_NAME
HWM_TM_APPROVAL_CHAINSApproval workflow routing for timecardsAPPROVAL_CHAIN_ID, APPROVER_PERSON_ID, APPROVAL_SEQUENCE
HWM_TM_TRANSFER_BATCHESTracks batches of approved time transferred to payrollTRANSFER_BATCH_ID, TRANSFER_DATE, BATCH_STATUS, PERIOD_START_DATE, PERIOD_END_DATE

3. Timecard Processing Flow

Understanding how Oracle processes timecards maps directly to which tables are populated at each stage:

1
Employee Enters TimeCreates rows in HWM_TM_REP_TIMES with START_DATE, END_DATE, DURATION_HOURS. A header row is created in HWM_TM_TIME_CARDS with TIMECARD_STATUS = 'OPEN'.
2
Submit for ApprovalTIMECARD_STATUS changes to 'SUBMITTED'. TIME_APPROVAL_STATUS in HWM_TM_REP_TIMES is set to 'SUBMITTED'. SUBMITTED_DATE is populated.
3
Apply Time RulesOracle evaluates HWM_TM_RULE_SETS against the time entries. Overtime thresholds, break deductions, and shift differentials are calculated. Results written to HWM_TM_DURATIONS with categorized hours (REG, OT, DIFF).
4
Manager ApprovalApproval workflow routes to manager per HWM_TM_APPROVAL_CHAINS. On approve: TIMECARD_STATUS → 'APPROVED', APPROVED_DATE populated. On reject: status → 'REJECTED', returned to employee.
5
Transfer to PayrollApproved time is batched in HWM_TM_TRANSFER_BATCHES and mapped to payroll element entries in PAY_ELEMENT_ENTRIES_F. TIME_CATEGORY_CODE maps to element types (Regular Earnings, Overtime, Shift Premium).
6
Payroll ProcessingPayroll run picks up element entries, applies pay rates, and generates PAY_RUN_RESULTS with calculated earnings (Hours × Rate = Amount).

4. Work Schedules & Assignments

Work schedules define when employees are expected to work. They drive overtime calculations (hours beyond scheduled = OT) and are used for absence accrual rules.

Schedule Architecture

⚠️

Date-effective joins: When joining schedule assignments to time entries, always filter on hwm.START_DATE BETWEEN wsa.EFFECTIVE_START_DATE AND wsa.EFFECTIVE_END_DATE. Employees can change schedules mid-period (e.g., transferring from day shift to night shift).

Common Schedule Types

Schedule NamePatternWeekly HoursOT Trigger
Standard 5x8Mon–Fri, 8h/day40>8h/day or >40h/week
Compressed 4x10Mon–Thu, 10h/day40>10h/day or >40h/week
Rotating ShiftVariable pattern (e.g., 4-on/3-off)VariesPer schedule rules
Part-TimeMon/Wed/Fri, 6h/day18>6h/day (if configured)

5. OTBI Subject Areas

Oracle provides several OTBI subject areas for Time and Labor reporting. These are the most useful for common reporting needs:

Subject AreaBest ForKey DimensionsKey Measures
Workforce Management — Reported Time Real TimeIndividual time entries, hours by category, approval trackingWorker, Period, Time Category, Schedule, StatusHours Worked, Duration, Start/End Time
Workforce Management — Time Card Real TimeTimecard-level reporting, submission and approval statusWorker, Assignment, Period, StatusTotal Hours, Submission Date, Approval Date
Workforce Management — Work Schedule Real TimeSchedule definitions and worker assignmentsSchedule, Effective Dates, AssignmentScheduled Hours, Pattern
Time and Labor — Time CategoriesTime category breakdown and configurationCategory Code, Category NameHours per Category
💡

Tip: Use Workforce Management — Reported Time Real Time as your primary subject area for most time reports. It includes worker demographics, department, time details, and approval status all in one subject area without needing cross-subject joins.

6. Six Production SQL Queries

All queries filter on TIME_APPROVAL_STATUS = 'APPROVED' by default. Remove this filter if you need pending/submitted time for dashboard views.

Query 1: Hours by Department (Last 6 Months)

Department Hours Summary
SELECT dept_tl.name                     AS department,
       SUM(hwm.duration_hours)          AS total_hours,
       ROUND(AVG(hwm.duration_hours), 2) AS avg_hours_per_entry,
       COUNT(DISTINCT hwm.time_id)      AS num_entries,
       COUNT(DISTINCT hwm.person_id)    AS num_employees
FROM   hwm_tm_rep_times hwm
JOIN   per_all_assignments_m paam
       ON hwm.assignment_id = paam.assignment_id
       AND hwm.start_date BETWEEN paam.effective_start_date
                                    AND paam.effective_end_date
JOIN   hr_all_organization_units_f_tl dept_tl
       ON paam.organization_id = dept_tl.organization_id
       AND dept_tl.language = USERENV('LANG')
       AND hwm.start_date BETWEEN dept_tl.effective_start_date
                                    AND dept_tl.effective_end_date
WHERE  hwm.start_date >= TRUNC(SYSDATE) - 180
  AND  hwm.time_approval_status = 'APPROVED'
GROUP BY dept_tl.name
ORDER BY total_hours DESC;

Query 2: Overtime Analysis (Last 30 Days)

Overtime Hours by Employee
SELECT papf.person_number,
       ppnf.full_name,
       hwm.time_category_code,
       SUM(hwm.duration_hours)    AS total_hours,
       COUNT(*)                    AS num_entries,
       MIN(hwm.start_date)         AS first_entry,
       MAX(hwm.start_date)         AS last_entry
FROM   hwm_tm_rep_times hwm
JOIN   per_all_people_f papf
       ON hwm.person_id = papf.person_id
       AND TRUNC(SYSDATE) BETWEEN papf.effective_start_date
                                        AND papf.effective_end_date
JOIN   per_person_names_f ppnf
       ON papf.person_id = ppnf.person_id
       AND ppnf.name_type = 'GLOBAL'
       AND TRUNC(SYSDATE) BETWEEN ppnf.effective_start_date
                                        AND ppnf.effective_end_date
WHERE  hwm.time_approval_status = 'APPROVED'
  AND  hwm.time_category_code = 'OT'
  AND  hwm.start_date >= TRUNC(SYSDATE) - 30
GROUP BY papf.person_number, ppnf.full_name, hwm.time_category_code
ORDER BY total_hours DESC;

Query 3: Unapproved Timecards (Pending Manager Action)

Timecards Awaiting Approval
SELECT papf.person_number,
       ppnf.full_name,
       dept_tl.name                    AS department,
       htc.timecard_status,
       COUNT(hwm.time_id)              AS pending_entries,
       SUM(hwm.duration_hours)          AS total_pending_hours,
       MIN(hwm.start_date)              AS oldest_entry
FROM   hwm_tm_rep_times hwm
JOIN   hwm_tm_time_cards htc
       ON hwm.timecard_id = htc.time_card_id
JOIN   per_all_people_f papf
       ON hwm.person_id = papf.person_id
       AND TRUNC(SYSDATE) BETWEEN papf.effective_start_date
                                        AND papf.effective_end_date
JOIN   per_person_names_f ppnf
       ON papf.person_id = ppnf.person_id
       AND ppnf.name_type = 'GLOBAL'
       AND TRUNC(SYSDATE) BETWEEN ppnf.effective_start_date
                                        AND ppnf.effective_end_date
JOIN   per_all_assignments_m paam
       ON hwm.assignment_id = paam.assignment_id
       AND hwm.start_date BETWEEN paam.effective_start_date
                                    AND paam.effective_end_date
LEFT JOIN hr_all_organization_units_f_tl dept_tl
       ON paam.organization_id = dept_tl.organization_id
       AND dept_tl.language = USERENV('LANG')
       AND hwm.start_date BETWEEN dept_tl.effective_start_date
                                    AND dept_tl.effective_end_date
WHERE  hwm.time_approval_status IN ('SUBMITTED', 'PENDING')
GROUP BY papf.person_number, ppnf.full_name, dept_tl.name, htc.timecard_status
ORDER BY oldest_entry;

Query 4: Weekly Hours Trend (Regular vs Overtime)

Weekly Hours Breakdown by Category
SELECT TRUNC(hwm.start_date, 'IW')    AS week_start,
       hwm.time_category_code,
       SUM(hwm.duration_hours)          AS total_hours,
       COUNT(DISTINCT hwm.person_id)    AS num_employees
FROM   hwm_tm_rep_times hwm
WHERE  hwm.time_approval_status = 'APPROVED'
  AND  hwm.start_date >= TRUNC(SYSDATE) - 90
GROUP BY TRUNC(hwm.start_date, 'IW'), hwm.time_category_code
ORDER BY week_start DESC, hwm.time_category_code;

Query 5: Schedule Compliance (Actual vs Scheduled)

Variance: Worked Hours vs Scheduled Hours
SELECT papf.person_number,
       ppnf.full_name,
       ws.work_schedule_name,
       SUM(hwm.duration_hours)       AS actual_hours,
       SUM(wsd.scheduled_hours)      AS scheduled_hours,
       SUM(hwm.duration_hours) - SUM(wsd.scheduled_hours)
                                      AS variance_hours
FROM   hwm_tm_rep_times hwm
JOIN   per_all_people_f papf
       ON hwm.person_id = papf.person_id
       AND TRUNC(SYSDATE) BETWEEN papf.effective_start_date
                                        AND papf.effective_end_date
JOIN   per_person_names_f ppnf
       ON papf.person_id = ppnf.person_id
       AND ppnf.name_type = 'GLOBAL'
       AND TRUNC(SYSDATE) BETWEEN ppnf.effective_start_date
                                        AND ppnf.effective_end_date
JOIN   hwm_work_schedule_assignments wsa
       ON hwm.person_id = wsa.person_id
       AND hwm.start_date BETWEEN wsa.effective_start_date
                                    AND wsa.effective_end_date
JOIN   hwm_work_schedules ws
       ON wsa.work_schedule_id = ws.work_schedule_id
JOIN   hwm_work_schedule_details wsd
       ON ws.work_schedule_id = wsd.work_schedule_id
       AND wsd.day_of_week = TO_CHAR(hwm.start_date, 'DY')
WHERE  hwm.time_approval_status = 'APPROVED'
  AND  hwm.start_date >= TRUNC(SYSDATE) - 30
GROUP BY papf.person_number, ppnf.full_name, ws.work_schedule_name
HAVING ABS(SUM(hwm.duration_hours) - SUM(wsd.scheduled_hours)) > 2
ORDER BY variance_hours DESC;

Query 6: Time-to-Payroll Transfer Audit

Approved Time Not Yet Transferred to Payroll
SELECT papf.person_number,
       ppnf.full_name,
       hwm.time_category_code,
       SUM(hwm.duration_hours)       AS approved_hours,
       MIN(hwm.start_date)            AS earliest_date,
       MAX(hwm.start_date)            AS latest_date,
       hwm.timecard_id
FROM   hwm_tm_rep_times hwm
JOIN   per_all_people_f papf
       ON hwm.person_id = papf.person_id
       AND TRUNC(SYSDATE) BETWEEN papf.effective_start_date
                                        AND papf.effective_end_date
JOIN   per_person_names_f ppnf
       ON papf.person_id = ppnf.person_id
       AND ppnf.name_type = 'GLOBAL'
       AND TRUNC(SYSDATE) BETWEEN ppnf.effective_start_date
                                        AND ppnf.effective_end_date
LEFT JOIN hwm_tm_transfer_batches tb
       ON hwm.start_date BETWEEN tb.period_start_date
                                    AND tb.period_end_date
       AND tb.batch_status = 'COMPLETE'
WHERE  hwm.time_approval_status = 'APPROVED'
  AND  tb.transfer_batch_id IS NULL  -- Not yet transferred
  AND  hwm.start_date >= TRUNC(SYSDATE) - 60
GROUP BY papf.person_number, ppnf.full_name,
         hwm.time_category_code, hwm.timecard_id
ORDER BY earliest_date;

7. Payroll Transfer Mapping

When approved time transfers to payroll, Oracle maps time categories to payroll elements. The mapping is configurable per business unit, but the standard pattern is:

Time Category CodePayroll ElementCalculation
REGRegular EarningsHours × Base Rate
OTOvertime EarningsHours × Base Rate × 1.5 (or 2.0)
DIFFShift DifferentialHours × Differential Rate
HOLIDAYHoliday PayScheduled Hours × Base Rate (or premium)
CALLBACKCallback PayMinimum guarantee + Hours × Rate
ℹ️

Transfer verification: After each payroll transfer, compare SUM(duration_hours) from HWM_TM_REP_TIMES (where transferred) against SUM(screen_entry_value) from PAY_ELEMENT_ENTRY_VALUES_F (where input_value = 'Hours') for the same period. Any mismatch indicates a mapping or rounding issue.

8. Reporting Tips & Gotchas

Critical Join Patterns

Common Pitfalls

⚠️

Duration vs. Calculated Duration: HWM_TM_REP_TIMES.DURATION_HOURS is the raw employee-entered value. HWM_TM_DURATIONS contains the post-rules calculated value (after break deductions, rounding, OT splitting). For accurate payroll reporting, always use the durations table.

Performance Tips

💡

Quick reference: The FK chain for time reporting is: HWM_TM_REP_TIMES.PERSON_IDPER_ALL_PEOPLE_F.PERSON_ID | HWM_TM_REP_TIMES.ASSIGNMENT_IDPER_ALL_ASSIGNMENTS_M.ASSIGNMENT_ID | HWM_TM_REP_TIMES.TIMECARD_IDHWM_TM_TIME_CARDS.TIME_CARD_ID