Wie können wir helfen?

Timetrack Days Tabelle

Daten der Mitarbeiterzeiterfassung

🔑 Identifikation & Basis-Informationen

Spalte
Typ
Beschreibung
Mögliche Werte / Beispiele
prism_uid
varchar
Eindeutige PRISM-ID für diesen Tages-Datensatz
timetrack_day_person123_20251112
prism_access_group
varchar
Zugriffsgruppe in PRISM
Firmen-/Organisations-ID
prism_access_user
varchar
Zugriffsberechtigter Benutzer
User-ID
prism_source_system
varchar
Quellsystem der Daten
poool
prism_source_reference
jsonb
JSON-Referenz zum Quellsystem
{"person_id": "123", "staff_id": "456"}

🏢 Meta-Informationen

Spalte
Typ
Beschreibung
Mögliche Werte / Beispiele
meta_domain_label
varchar
Domain-/Mandanten-Bezeichnung
company-x, acme-corp
meta_instance_label
varchar
Instanz-Bezeichnung
production, staging
meta_instance_country
varchar
Land der Instanz
DE, AT, CH

👤 Person/Mitarbeiter:in

Spalte
Typ
Beschreibung
Mögliche Werte / Beispiele
data_person_poool_uid
varchar
Eindeutige Poool-ID der Person
person_123456
data_person_label
varchar
Vollständiger Name der Person
Max Mustermann, Anna Schmidt
data_person_firstname
varchar
Vorname
Max, Anna
data_person_lastname
varchar
Nachname
Mustermann, Schmidt
data_person_email
varchar
E-Mail-Adresse
data_person_team_label
varchar
Team-Name
Entwicklung, Design
data_person_team_token
varchar
Team-Kürzel
dev, design
data_person_planner_team
varchar
Planer-Team
Team-Bezeichnung für Ressourcenplanung

📅 Datum & Tag-Informationen

Spalte
Typ
Beschreibung
Mögliche Werte / Beispiele
data_day_date
date
Das Datum des Tages
2025-11-12, 2025-03-15
data_day_cw
varchar
Kalenderwoche
2025-W46, 2024-W52
data_day_weekday
varchar
Wochentag (ausgeschrieben)
Montag, Dienstag, Mittwoch
data_day_weekday_index
int4
Wochentag als Index
1 = Montag 2 = Dienstag ... 7 = Sonntag
data_day_is_holiday
bool
Feiertags-Flag
true = Feiertag false = regulärer Tag
data_day_type_description
varchar
Tag-Typ Beschreibung
Arbeitstag, Feiertag, Urlaub, Wochenende
data_day_comment
text
Kommentar zum Tag
Freitext-Kommentare, z.B. "Homeoffice", "Außendienst"

💡 Tipp: Verwende data_day_date für Joins mit der meta_dates Tabelle für erweiterte Zeitauswertungen!


🎯 Arbeitszeit Soll (Target)

💡 Hinweis: Diese Felder enthalten die geplante/vertraglich vereinbarte Arbeitszeit

Spalte
Typ
Beschreibung
Mögliche Werte / Beispiele
data_working_time_target_from
int4
Soll-Arbeitsbeginn in Minuten seit Mitternacht
480 (= 08:00 Uhr) 540 (= 09:00 Uhr)
data_working_time_target_to
int4
Soll-Arbeitsende in Minuten seit Mitternacht
1020 (= 17:00 Uhr) 1080 (= 18:00 Uhr)
data_working_time_target_break
int4
Soll-Pausenzeit in Minuten
60 (= 1h) 45 (= 45min)
data_working_time_target_netto
int4
Soll-Nettoarbeitszeit in Minuten (ohne Pausen)
480 (= 8h) 420 (= 7h)

💡 Berechnung: target_netto = (target_to - target_from) - target_break


⏱️ Arbeitszeit Ist (tatsächlich erfasst)

💡 Hinweis: Diese Felder enthalten die tatsächlich erfasste Arbeitszeit

Spalte
Typ
Beschreibung
Mögliche Werte / Beispiele
data_working_time_from
int4
Ist-Arbeitsbeginn in Minuten seit Mitternacht
495 (= 08:15 Uhr) 0 (= nicht erfasst)
data_working_time_to
int4
Ist-Arbeitsende in Minuten seit Mitternacht
1035 (= 17:15 Uhr) 0 (= nicht erfasst)
data_working_time_break
int4
Ist-Pausenzeit in Minuten
60 (= 1h) 45 (= 45min)
data_working_time_netto
int4
Ist-Nettoarbeitszeit in Minuten (ohne Pausen)
480 (= 8h) 540 (= 9h)
data_working_time_unused
int4
Nicht genutzte Arbeitszeit in Minuten
Differenz zwischen Soll und gebuchter Zeit

💡 Berechnung: netto = (to - from) - break


⚡ Gleitzeit

Spalte
Typ
Beschreibung
Mögliche Werte / Beispiele
data_flextime_change
int4
Tägliche Gleitzeit-Änderung in Minuten
60 (= +1h Guthaben) -30 (= -0.5h Minus) 0 (= ausgeglichen)

💡 Berechnung: flextime_change = working_time_netto - working_time_target_netto

Beispiel:

  • Soll: 480 Min (8h)
  • Ist: 540 Min (9h)
  • Gleitzeit-Änderung: +60 Min (+1h)

📊 Zeittypen-Summen

💡 Hinweis: Diese Felder zeigen, wie die Arbeitszeit des Tages aufgeteilt wurde

Spalte
Typ
Beschreibung
Mögliche Werte / Beispiele
data_timetrack_regular_sum
int4
Reguläre Projektzeit in Minuten
480 (= 8h auf Projekten gebucht)
data_timetrack_internal_sum
int4
Interne Zeit in Minuten (Meetings, Admin, etc.)
120 (= 2h intern)
data_timetrack_vacation_sum
int4
Urlaubszeit in Minuten
480 (= 8h Urlaub = 1 Tag)
data_timetrack_sick_sum
int4
Krankheitszeit in Minuten
480 (= 8h krank = 1 Tag)
data_timetrack_comp_time_sum
int4
Freizeitausgleich in Minuten
480 (= 8h Überstundenabbau)
data_timetrack_total_sum
int4
Gesamte gebuchte Zeit in Minuten
Summe aller Zeitbuchungen des Tages

💡 Idealerweise gilt: total_sum = regular_sum + internal_sum + vacation_sum + sick_sum + comp_time_sum


📈 Arbeitszeitkonto-Modifikationen

💡 Hinweis: Diese Felder zeigen, wie dieser Tag die Arbeitszeitkonten beeinflusst

Spalte
Typ
Beschreibung
Mögliche Werte / Beispiele
data_working_time_account_modification_flextime
float8
Änderung des Gleitzeit-Kontos in Stunden
1.5 (= +1.5h) -0.5 (= -0.5h)
data_working_time_account_modification_overtime
float8
Änderung des Überstunden-Kontos in Stunden
2.0 (= +2h) -1.0 (= -1h Abbau)
data_working_time_account_modification_vacation_days
float8
Änderung Urlaubstage-Konto
-1.0 (= 1 Urlaubstag genommen) 0.5 (= halber Tag)
data_working_time_account_modification_vacation_time
float8
Änderung Urlaubszeit-Konto in Stunden
-8.0 (= 8h Urlaub genommen)
data_working_time_account_modification_details
jsonb
Detaillierte Modifikations-Informationen (JSON)
Zusätzliche Details zu den Kontoänderungen

💡 Wichtig: Diese Werte summieren sich über das Jahr zum Jahres-Arbeitszeitkonto (siehe Timetrack Working Time Accounts)


🔒 Zeiterfassungs-Kontrolle & Validierung

Spalte
Typ
Beschreibung
Mögliche Werte / Beispiele
data_timetrack_locked
bool
Tag gesperrt für Bearbeitung?
true = gesperrt false = editierbar
data_timetrack_location
varchar
Arbeitsort
office = Büro homeoffice = Homeoffice client = Beim Kunden
data_timetrack_is_invalid
bool
Zeiterfassung ungültig/fehlerhaft?
true = ungültig false = gültig
data_timetrack_is_invalid_reason
text
Grund für Ungültigkeit
Keine Zeitbuchungen, Soll-Zeit nicht erreicht, Überschneidungen

⚠️ Wichtig:

  • Gesperrte Tage können nicht mehr bearbeitet werden
  • Ungültige Tage sollten korrigiert werden
  • is_invalid = true weist auf Datenkonsistenz-Probleme hin

🔑 System-Felder (Prism-Interna)

Spalte
Typ
Beschreibung
Mögliche Werte / Beispiele
prism_created_at
timestamp
Zeitstempel der Erstellung
2025-11-12 00:00:00
prism_updated_at
timestamp
Zeitstempel der letzten Aktualisierung
2025-11-12 18:30:00

💡 Häufige Verwendungen

Arbeitszeit-Übersicht nach Person (Monat)

SELECT 
    data_person_label,
    data_person_team_label,
    COUNT(*) as arbeitstage,
    ROUND(SUM(data_working_time_netto) / 60.0, 2) as stunden_ist,
    ROUND(SUM(data_working_time_target_netto) / 60.0, 2) as stunden_soll,
    ROUND((SUM(data_working_time_netto) - SUM(data_working_time_target_netto)) / 60.0, 2) as differenz_stunden
FROM timetrack_days 
WHERE data_day_date >= DATE_TRUNC('month', CURRENT_DATE)
    AND data_working_time_netto > 0
GROUP BY data_person_label, data_person_team_label
ORDER BY stunden_ist DESC;

Gleitzeit-Entwicklung (kumulativ)

SELECT 
    data_person_label,
    data_day_date,
    data_flextime_change,
    SUM(data_flextime_change) OVER (
        PARTITION BY data_person_poool_uid 
        ORDER BY data_day_date
    ) / 60.0 as gleitzeit_kumulativ_stunden
FROM timetrack_days 
WHERE data_person_poool_uid = 'person_123456'
    AND data_day_date >= DATE_TRUNC('year', CURRENT_DATE)
ORDER BY data_day_date;

Team-Auslastung (Zeittypen-Verteilung)

SELECT 
    data_person_team_label,
    COUNT(DISTINCT data_person_poool_uid) as anzahl_mitarbeiter,
    ROUND(SUM(data_timetrack_regular_sum) / 60.0, 2) as stunden_projektzeit,
    ROUND(SUM(data_timetrack_internal_sum) / 60.0, 2) as stunden_intern,
    ROUND(SUM(data_timetrack_vacation_sum) / 60.0, 2) as stunden_urlaub,
    ROUND(SUM(data_timetrack_sick_sum) / 60.0, 2) as stunden_krank,
    ROUND(SUM(data_timetrack_total_sum) / 60.0, 2) as stunden_gesamt
FROM timetrack_days 
WHERE data_day_date >= DATE_TRUNC('month', CURRENT_DATE)
GROUP BY data_person_team_label
ORDER BY stunden_projektzeit DESC;

Urlaubstage-Tracking (Jahresübersicht)

SELECT 
    data_person_label,
    COUNT(CASE WHEN data_timetrack_vacation_sum > 0 THEN 1 END) as urlaubstage_genommen,
    ROUND(SUM(data_timetrack_vacation_sum) / 60.0 / 8.0, 1) as urlaubstage_equivalent,
    ROUND(SUM(data_working_time_account_modification_vacation_days), 1) as urlaubstage_konto_abzug
FROM timetrack_days 
WHERE data_day_date >= DATE_TRUNC('year', CURRENT_DATE)
GROUP BY data_person_label
ORDER BY urlaubstage_genommen DESC;

Soll-Ist Abweichung (durchschnittlich)

SELECT 
    data_person_label,
    COUNT(*) as arbeitstage,
    ROUND(AVG(data_working_time_target_netto) / 60.0, 2) as soll_stunden_tag_avg,
    ROUND(AVG(data_working_time_netto) / 60.0, 2) as ist_stunden_tag_avg,
    ROUND((AVG(data_working_time_netto) - AVG(data_working_time_target_netto)) / 60.0, 2) as abweichung_avg
FROM timetrack_days 
WHERE data_day_date >= CURRENT_DATE - INTERVAL '30 days'
    AND data_working_time_target_netto > 0
GROUP BY data_person_label
ORDER BY abweichung_avg DESC;

Feiertage und Abwesenheiten

SELECT 
    data_person_label,
    data_day_date,
    data_day_weekday,
    data_day_type_description,
    CASE 
        WHEN data_day_is_holiday = true THEN 'Feiertag'
        WHEN data_timetrack_vacation_sum > 0 THEN 'Urlaub'
        WHEN data_timetrack_sick_sum > 0 THEN 'Krank'
        WHEN data_timetrack_comp_time_sum > 0 THEN 'Freizeitausgleich'
        ELSE 'Arbeitstag'
    END as abwesenheits_typ
FROM timetrack_days 
WHERE data_day_date >= DATE_TRUNC('month', CURRENT_DATE)
    AND (
        data_day_is_holiday = true 
        OR data_timetrack_vacation_sum > 0 
        OR data_timetrack_sick_sum > 0
        OR data_timetrack_comp_time_sum > 0
    )
ORDER BY data_person_label, data_day_date;

Ungültige/Fehlerhafte Tage identifizieren

SELECT 
    data_person_label,
    data_day_date,
    data_timetrack_is_invalid,
    data_timetrack_is_invalid_reason,
    ROUND(data_working_time_netto / 60.0, 2) as ist_stunden,
    ROUND(data_working_time_target_netto / 60.0, 2) as soll_stunden
FROM timetrack_days 
WHERE data_timetrack_is_invalid = true
    AND data_day_date >= CURRENT_DATE - INTERVAL '30 days'
ORDER BY data_day_date DESC, data_person_label;

⚠️ Wichtige Hinweise

Zeiteinheiten beachten

  • ⚠️ Alle Zeitwerte sind in Minuten gespeichert (nicht Stunden!)
  • ⚠️ Ausnahme: data_working_time_account_modification_* Felder sind in Stunden (float8)
  • Umrechnung in Stunden: minuten / 60.0
  • Umrechnung Minuten seit Mitternacht in Uhrzeit: 08:00 Uhr = 480 Minuten

Uhrzeit-Umrechnung

-- Von Minuten zu Uhrzeit
SELECT 
    LPAD((data_working_time_from / 60)::text, 2, '0') || ':' || 
    LPAD((data_working_time_from % 60)::text, 2, '0') as von_uhrzeit,
    LPAD((data_working_time_to / 60)::text, 2, '0') || ':' || 
    LPAD((data_working_time_to % 60)::text, 2, '0') as bis_uhrzeit
FROM timetrack_days
WHERE data_working_time_from > 0;

Soll vs. Ist verstehen

  • Target-Felder (*_target_*) = Vertraglich vereinbarte Arbeitszeit
  • Ist-Felder (working_time_* ohne target) = Tatsächlich erfasste Zeiten
  • Gleitzeit entsteht aus der Differenz zwischen Soll und Ist

Zeittypen-Summen

  • regular_sum = Produktive Projektzeit
  • internal_sum = Meetings, Admin, Schulungen
  • vacation_sum = Urlaub
  • sick_sum = Krankheit
  • comp_time_sum = Überstundenabbau

Datenkonsistenz

  • Gesperrte Tage (locked = true) können nicht bearbeitet werden
  • Ungültige Tage (is_invalid = true) weisen auf Probleme hin
  • Filter in Reports: WHERE data_timetrack_is_invalid = false

🔗 Verwandte Tabellen

  • Contacts: Mitarbeiter:innen-Stammdaten (verknüpft über data_person_poool_uid)
  • Timetrack Times: Einzelne Zeitbuchungen, die zu den Tages-Summen führen
  • Timetrack Working Time Accounts: Jahres-Arbeitszeitkonten (Aggregation der täglichen Modifikationen)
  • Meta Dates: Datumsinformationen für erweiterte Zeitauswertungen
Konnten wir hiermit helfen?
😞
😐
🤩