Announcement

Collapse
No announcement yet.

Stechuhr - von bis Zeit pro Mitarbeiter nur einmal zulassen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Stechuhr - von bis Zeit pro Mitarbeiter nur einmal zulassen

    hallo,
    ich bastle gerade an einer Kontrollauswertung von eine Tabelle in der ich ein von- und ein bis-Datum pro Mitarbeiter speichere. Nun möchte ich prüfen ob ein Mitarbeiter eine Überschneidung der Zeiträume eingegeben hat.

    Mir fällt jetzt nur ein immer die Kombination zwischen von und bis Datum aus Jahr, Monat, Tag, Stunde, Minute, Mitarbeiter zu zählen und zu schauen ob das größer 1 ist.

    Gibt es etwas direkteres?

  • #2
    Hallo,

    Überschneidungen des Zeitraumes A[von, bis] mit B[von, bis] findet man mit der Prüfung:
    B.bis > A.von AND B.von < A.Bis
    Damit sind alle Varianten und Überschneidungen abgedeckt.
    Mit einem einfachen Self-Join solltest du damit also mögliche Überschneidungen pro Mitarbeiter finden.
    [highlight=sql]
    select *
    from Mitarbeiter A
    inner join Mitarbeiter B on B.bis > A.von AND B.von < A.Bis
    AND A.id = B.id
    [/highlight]

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Originally posted by openshinok View Post
      hallo,
      ich bastle gerade an einer Kontrollauswertung von eine Tabelle in der ich ein von- und ein bis-Datum pro Mitarbeiter speichere. Nun möchte ich prüfen ob ein Mitarbeiter eine Überschneidung der Zeiträume eingegeben hat.

      Mir fällt jetzt nur ein immer die Kombination zwischen von und bis Datum aus Jahr, Monat, Tag, Stunde, Minute, Mitarbeiter zu zählen und zu schauen ob das größer 1 ist.

      Gibt es etwas direkteres?
      Ja, aber wohl nur in PostgreSQL. RANGE-Typen und Exclusion Constraints - kurze Demo:

      Code:
      test=# create table stechuhr (mitarbeiter int, zeit tsrange, exclude using gist(mitarbeiter with =, zeit with &&));
      NOTICE:  CREATE TABLE / EXCLUDE will create implicit index "stechuhr_mitarbeiter_zeit_excl" for table "stechuhr"
      CREATE TABLE
      test=*# insert into stechuhr values (1, '[2013-06-27 10:00:00, 2013-06-27 12:00:00)');
      INSERT 0 1
      test=*# insert into stechuhr values (1, '[2013-06-27 14:00:00, 2013-06-27 16:00:00)');
      INSERT 0 1
      test=*# insert into stechuhr values (1, '[2013-06-27 15:00:00, 2013-06-27 17:00:00)');
      ERROR:  conflicting key value violates exclusion constraint "stechuhr_mitarbeiter_zeit_excl"
      DETAIL:  Key (mitarbeiter, zeit)=(1, ["2013-06-27 15:00:00","2013-06-27 17:00:00")) conflicts with existing key (mitarbeiter, zeit)=(1, ["2013-06-27 14:00:00","2013-06-27 16:00:00")).
      Wenn Du dazu mehr wissen willst, dann entweder im PostgreSQL-Forum (hier oder pg-forum.de) oder PM.

      Comment


      • #4
        hallo, das sieht schon mal sehr gut aus. Vielen Dank! Allerdings musste ich noch im Join angeben dass sich die PK unterscheiden müssen. Sonst vergleicht er durch den Selfjoin ja auch zwei identische Datensätze :-)

        AND A.pkfeld <> B.pkfeld

        Comment

        Working...
        X