使用日期函数 mysql 并在跟踪的同时添加日期
Working with Date functions mysql and adding day to date while keeping track
所以我有这个 table
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;
如何使用日期功能检查一天是否已经过去等并为每一天添加计算滞纳金?请有什么更好的谢谢。
如果我理解了问题,那么就像
IF NEW.ClearanceDate > NEW.`Date` THEN
UPDATE chittyusers
SET LatePaymentFee = 10 * DATEDIFF(NEW.ClearanceDate, NEW.`Date`)
WHERE UserId = userId;
END IF;
适用于您当前的架构。 DATEDIFF(date1, date2)
returns date1
和 date2
之间的天数 - 如果 date1
早于 date2
,则结果为负。请注意,我已将比较运算符从 <>
更改为 >
,因此如果 ClearanceDate
在 Date
之后,则适用滞纳金,但如果在 [=24= 之前,则不适用。 ]
我应该指出,在您的代码中使用像 10
这样的纯数字常量被认为是非常糟糕的形式。稍微好一点的方法是声明一个名为 baseLateFee
的局部变量,将其设置为 10,然后在计算中使用该变量。一个更好的选择,特别是如果 baseLateFee
有任何可能改变的情况下,将它存储在 table 某个地方,这样你就可以更新它而不必查找和更改依赖于的所有代码它。
所以我有这个 table
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;
如何使用日期功能检查一天是否已经过去等并为每一天添加计算滞纳金?请有什么更好的谢谢。
如果我理解了问题,那么就像
IF NEW.ClearanceDate > NEW.`Date` THEN
UPDATE chittyusers
SET LatePaymentFee = 10 * DATEDIFF(NEW.ClearanceDate, NEW.`Date`)
WHERE UserId = userId;
END IF;
适用于您当前的架构。 DATEDIFF(date1, date2)
returns date1
和 date2
之间的天数 - 如果 date1
早于 date2
,则结果为负。请注意,我已将比较运算符从 <>
更改为 >
,因此如果 ClearanceDate
在 Date
之后,则适用滞纳金,但如果在 [=24= 之前,则不适用。 ]
我应该指出,在您的代码中使用像 10
这样的纯数字常量被认为是非常糟糕的形式。稍微好一点的方法是声明一个名为 baseLateFee
的局部变量,将其设置为 10,然后在计算中使用该变量。一个更好的选择,特别是如果 baseLateFee
有任何可能改变的情况下,将它存储在 table 某个地方,这样你就可以更新它而不必查找和更改依赖于的所有代码它。