Работа с функциями даты 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;

Я создаю триггер, который проверяет Date и clearanceDate чтобы увидеть, если 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 ответ

Решение

Если я понял вопрос, то что-то вроде

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

будет работать с вашей текущей схемой. DATEDIFF(date1, date2) возвращает количество дней между date1 а также date2 - результат отрицательный, если date1 раньше чем date2, Обратите внимание, что я изменил оператор сравнения с <> в > так что поздний сбор применяется, если ClearanceDate после Date, но не если это раньше.

Я должен отметить, что имея голую числовую константу, такую ​​как 10 в вашем коде это считается очень плохой формой. Немного лучше было бы объявить локальную переменную с именем baseLateFee установите его равным 10, а затем используйте переменную в своих расчетах. Гораздо лучшая альтернатива, особенно если есть вероятность, что baseLateFee когда-либо изменится, будет хранить его в таблице где-нибудь, чтобы вы могли обновить его, не находя и не изменяя весь код, который от него зависит.

Другие вопросы по тегам