Doppelbuchungen finden

its_dows

Neuer Benutzer
Beiträge
3
Hallo zusammen,
ich muss im Moment eine Abfrage schreiben um Doppelbuchungen unseres Kantinenbetreibers zu entdecken.
Die Struktur der Tabelle (in Auschnitten):

GeräteNr | smallint [PK]
BelegNr | int [PK]
SatzLaufnummer | int [PK]
Datum | smalldatetime
Uhrzeit | datetime
Personalnummer | nvarchar
Betrag | money


Als Doppelbuchung gelten Buchungen
  • am selben Tag
  • zur ähnlichen Uhrzeit [+/-20 Sekunden]
  • der selben Personalnummer
  • über den selben Betrag
Hier mal ein paar Beispieldatensätze mit einer Doppelbuchung:

1 | 53 | 744 | 2015-12-22 00:00:00 | 1899-12-30 12:15:15.000 | 134 | 2.2000
1 | 53 | 739 | 2015-12-22 00:00:00 | 1899-12-30 12:04:52.000 | 158 | 3.5000
1 | 53 | 720 | 2015-12-22 00:00:00 | 1899-12-30 08:32:12.000 | 163 | 1.5000
1 | 53 | 736 | 2015-12-22 00:00:00 | 1899-12-30 09:07:54.000 | 199 | 1.8000
1 | 53 | 766 | 2015-12-22 00:00:00 | 1899-12-30 12:40:20.000 | 199 | 3.1000
1 | 53 | 749 | 2015-12-22 00:00:00 | 1899-12-30 12:18:08.000 | 108 | 3.8000
1 | 53 | 750 | 2015-12-22 00:00:00 | 1899-12-30 12:18:20.000 | 108 | 3.8000

1 | 53 | 735 | 2015-12-22 00:00:00 | 1899-12-30 09:05:54.000 | 117 | 3.0000
1 | 53 | 742 | 2015-12-22 00:00:00 | 1899-12-30 12:14:05.000 | 117 | 3.8000
1 | 53 | 743 | 2015-12-22 00:00:00 | 1899-12-30 12:14:50.000 | 117 | 3.8000


Leider steh' ich hier extrem auf dem Schlauch und mir fehlt jeglicher Ansatz :(
Wäre für Lösungsvorschläge sehr dankbar.
 
Werbung:
Also Datum als SMALLDATETIME und Uhrzeit als DATETIME zu speichern ist ja schon gleich mehrfach Blödsinn, nur so am Rande. Was passiert denn bei Buchungen die zwischen 23:59:59 und 00:00:01 passieren?

Code:
SELECT    t1.*
FROM    tabelle t1
WHERE EXISTS (    SELECT    1
                FROM    tabelle t2
                WHERE (    t2.geraetenr <> t1.geraetenr
                OR        t2.belegnr <> t1.belegnr
                OR        t2.satzlaufnummer <> t1.satzlaufnummer )
                AND        t2.personalnummer = t1.personalnummer
                AND        t2.betrag = t2.betrag
                AND        t2.datum = t1.datum
                AND        timediff(sekunden,t2.uhrzeit,t1.uhrzeit) BETWEEN -20 AND 20 )
timediff() ist MySQL bin mir nicht ganz sicher wie man damit Sekunden bekommt, sollte aber irgendwie gehen.
 
Also Datum als SMALLDATETIME und Uhrzeit als DATETIME zu speichern ist ja schon gleich mehrfach Blödsinn, nur so am Rande. Was passiert denn bei Buchungen die zwischen 23:59:59 und 00:00:01 passieren?

Ich bin da ganz bei dir, allerdings ist die Tabelle nicht auf meinem Mist gewachsen....ich muss jetzt nur mit klar kommen. :/ Warum da nicht einfach eine DATETIME daraus gemacht wurde, hm. Buchungen im Mitternacht wird es in der Kantine hoffentlich nie geben.
Alleine schon als Spaltentitel Gerätenummer zu nehmen ist riskant.

Zum Lösungsvorschlag:
Zunächst vielen Dank. Das hat die Tabelle um mehr als 98% auf gut 110 Datensätze geschrumpft. Leider werden immer noch solche Werte angezeigt:

1 | 34 | 694 | 2015-11-27 00:00:00 | 1899-12-30 12:35:00.000 | 148 | 2.3000
1 | 34 | 695 | 2015-11-27 00:00:00 | 1899-12-30 12:35:13.000 | 148 | .2000


Die Filter auf Tag, Sekunden* und Personalnummer greifen also. Nur der auf Betrag irgendwie nicht.

*DATEDIFF(ss,t2.Uhrzeit,t1.Uhrzeit)
 
Werbung:
Sry Tippfehler, hab mich auch im Forum vertan dachte du machst MySQL, dabei hast du zumindest MSSQL :)

Du kannst natürlich Datum und Zeit addieren und damit vergleichen, ich weiß aber nich ob er 1899 dann dazu rechnet. Daher eventuell:
Code:
timediff(ss,
cast(t2.datum AS DATETIME) + cast(t2.zeit AS TIME),
cast(t1.datum AS DATETIME) + cast(t1.zeit AS TIME))
 
Zurück
Oben