使用Date函数mysql并在保持跟踪的同时添加日期

时间:2016-04-26 07:31:34

标签: mysql ddl database-trigger

所以我有这张桌子

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; 

使用日期功能,我如何检查是否已经过了一天等,并为每天添加计算延迟付款?请一切都会很好谢谢。

1 个答案:

答案 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,则结果为否定。请注意,我已将比较运算符从<>更改为>,因此如果ClearanceDate位于Date之后,则应用延迟费用,但如果之前的话,则会应用延迟费用。

我应该指出,在代码中使用像10这样的数字常量被认为是非常糟糕的形式。稍微好一点的方法是声明一个名为baseLateFee的局部变量,将其设置为10,然后在计算中使用该变量。一个更好的选择,特别是如果baseLateFee有可能改变的可能性,将把它存储在某个地方的表中,这样你就可以更新它而无需查找和更改所有依赖它的代码。