2016-04-26 6 views
0

So habe ich diese TabelleArbeiten mit Datumsfunktionen mysql und das Hinzufügen von Tag zu Tag, während Spur zu halten

CREATE TABLE `chittytransactions` (
    `ChittyTransactionID` int(11) NOT NULL, 
    `AuctionID` int(11) NOT NULL, 
    `ChittyAccNo` int(11) DEFAULT NULL, 
    `Date` datetime DEFAULT NULL, 
    `Amount` double DEFAULT NULL, 
    `Description` varchar(50) DEFAULT NULL, 
    `TransRefence` varchar(50) DEFAULT NULL COMMENT 'Reference from actual Bank transaction', 
    `TransStatus` tinyint(1) DEFAULT NULL COMMENT 'If Transaction Pending or Cleared', 
    `ClearanceDate` datetime DEFAULT NULL, 
    `PaymentMethod` int(1) DEFAULT NULL COMMENT '0- Cash, 1- bank transfer, 2- personal credit etc' 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

In Schaffung einen Trigger, der die Date und die clearanceDate überprüft, ob die clearanceDate größer als das tatsächliche Datum ist dann eine späte Gebühr hinzufügen. Ich habe dies so weit:

DROP TRIGGER IF EXISTS chitty_before_trig; 

DELIMITER ;; 
CREATE TRIGGER chitty_before_trig BEFORE INSERT ON chittytransactions 
FOR EACH ROW 
    BEGIN 
    DECLARE `userId` INT(11); 

    SELECT `UserId` 
    INTO `userId` 
    FROM chittyusers 
    WHERE ChittyAccNo = NEW.ChittyAccNo; 

    IF NEW.ClearanceDate <> NEW.`Date` THEN 
      UPDATE `chittyusers` SET LatePaymentFee = 50 WHERE UserId = userId; 
    END IF; 
END;; 
DELIMITER; 

die Datumsfunktionen Wie kann ich überprüfen, ob ein Tag etc gegangen ist, und fügen Sie für jeden Tag eine berechnen verspätete Zahlung Bitte alles wäre toll Danke.

+0

Sie sollten eigentlich nicht die späte Gebühr in der Tabelle speichern müssen, es sei denn, Sie müssen viel zugreifen, wie, * wirklich * sehr viel. Normalerweise mit einem Wert, der immer von anderen Werten in der Datenbank * abgeleitet * werden kann (insbesondere wenn sie in der gleichen Tabelle sind), würden Sie sie einfach jedes Mal berechnen, wenn Sie sie brauchen. Zu diesem Zweck werden häufig Ansichten verwendet. –

+0

keine späte Gebühr würde vom Datum abhängen. Wie wenn ein anderer Tag vergeht, würde sich die späte Gebühr ständig ändern. irgendeine Idee wie? – luffy

+0

Erzähl mir, wie die späte Gebühr berechnet wird. –

Antwort

1

Wenn ich die Frage verstanden habe, dann so etwas wie

IF NEW.ClearanceDate > NEW.`Date` THEN 
    UPDATE chittyusers 
    SET LatePaymentFee = 10 * DATEDIFF(NEW.ClearanceDate, NEW.`Date`) 
    WHERE UserId = userId; 
END IF; 

würde mit Ihrem aktuellen Schema arbeiten. DATEDIFF(date1, date2) gibt die Anzahl der Tage zwischen date1 und date2 zurück - das Ergebnis ist negativ, wenn date1 früher als date2 ist. Hinweis Ich habe den Vergleichsoperator von <> zu > geändert, sodass die Verzugsgebühr angewendet wird, wenn ClearanceDate nach Date liegt, aber nicht, wenn es vorher ist.

Ich sollte darauf hinweisen, dass eine bloße numerische Konstante wie 10 in Ihrem Code als sehr schlechte Form betrachtet wird. Ein etwas besserer Weg wäre, eine lokale Variable mit dem Namen baseLateFee zu deklarieren, auf 10 zu setzen und dann die Variable in Ihrer Berechnung zu verwenden. Eine viel bessere Alternative, besonders wenn es eine Möglichkeit gibt, dass sich baseLateFee jemals ändern wird, wäre, es irgendwo in einer Tabelle zu speichern, so dass Sie es aktualisieren können, ohne den ganzen Code zu finden und ändern zu müssen, der davon abhängt.

+0

Danke, ich werde es versuchen. Ja, ich über die Möglichkeit, verschiedene Tabelle für verspätete Zahlung, die sich ändert – luffy