2016-04-26 21 views
0

所以我有這個表與日期函數MySQL的工作,加入時至今同時跟蹤

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; 

林創建檢查DateclearanceDate,看是否clearanceDate比實際日期以上的觸發然後添加滯納金。我有這個至今:

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; 

使用日期函數如何檢查,如果一天已經等了並加入每一天的計算逾期付款請什麼將是巨大的,謝謝。

+0

實際上,您不需要在表格中存儲滯納金,除非您需要大量存取它,例如*真*很多。通常,可以從數據庫中的其他值(尤其是如果它們在同一個表中)中派生出一個值,您可以在每次需要時計算它們。視圖通常用於此目的。 –

+0

不收費取決於日期。就像另一天的遲到費用會不斷變化一樣。任何想法如何? – luffy

+0

告訴我遲到費用是如何計算的。 –

回答

1

如果我已經理解了問題,那麼像

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

將與您當前的模式工作。 DATEDIFF(date1, date2)返回date1date2之間的天數 - 如果date1早於date2,則結果爲負。注意我已將比較運算符從<>更改爲>,因此如果ClearanceDateDate之後,則應用滯後費用,但如果是之前則不適用。

我應該指出,在你的代碼中有一個像10這樣的裸數字常量被認爲是非常糟糕的形式。稍微好一點的方法是聲明一個名爲baseLateFee的局部變量,將其設置爲10,然後在計算中使用該變量。一個更好的選擇,特別是如果有任何可能改變,將存儲在一個表的某個地方,所以你可以更新它,而無需找到並更改所有依賴它的代碼。

+0

謝謝我會試試這個。是的,我雖然關於選擇不同的表,以延遲付款的變化 – luffy