根据日期,3字母代码和自动递增的序列号

时间:2016-05-14 11:07:27

标签: mysql

我有下表:

create table test
(
ID int not null AUTO_INCREMENT,
CreatedOn datetime not null DEFAULT CURRENT_TIMESTAMP,
OrderNo varchar(100) not null,
Primary Key (ID)
);

我想知道我是否可以订购这样的订单:DNB1605141

  • DNB - 是3个字母的代码
  • 16 - 是当前年份 - 需要从createdon列或当前时间戳中选取
  • 05 - 是当年的当月 - 需要从createdon列或当前时间戳中选取
  • 14 - 是当前日期 - 需要从createdon列或当前时间戳中选取
  • 1 - 是第一个订单

但是有一个条件,在每个月的开始,序列号应该重新设置为1。

例如:DNB1605011(2016年5月1日第1个订单),DNB1606011(2016年6月1日第1个订单)

我正在编写一个存储过程来将值插入表中。但我不知道如何生成订单号。

请指教。感谢

2 个答案:

答案 0 :(得分:0)

我没有通过Scheduler事件创建和监视,而是想通过日期函数来检查这个。在创建订单时插入之前没有它会检查DAYOFMONTH是否为1,如果是,那么它会将订单号重新设置为1,否则它将获取最大订单号。我将订单号存储在单独的列中,而前缀存储在单独的列中。

对于DNB1605141:A列中的DNB1605和B列中的141

以下是订单生成代码:

DELIMITER $$
DROP PROCEDURE IF EXISTS spCashDonation$$
CREATE PROCEDURE spCashDonation(IN fname varchar(50),IN lname varchar(50),IN telNo bigint, IN pmode tinyint,IN amt decimal(13,2), OUT rno varchar(20))
BEGIN
    Set @rmain := (select trim(concat('DNB', DATE_FORMAT(CURRENT_DATE(), '%y'), DATE_FORMAT(CURRENT_DATE(), '%m'))));

    IF ((trim(DATE_FORMAT(CURRENT_DATE(),'%m')) = 01) OR (trim(DATE_FORMAT(CURRENT_DATE(),'%m')) = 1)) THEN
        Set @rpart = 1;
    END IF;

    IF ((trim(DATE_FORMAT(CURRENT_DATE(),'%m')) != 01) OR (trim(DATE_FORMAT(CURRENT_DATE(),'%m')) != 1)) THEN
        Set @rpart := (select coalesce(max(ReceiptPart),0) from Donation) + 1;
    END IF;

 INSERT INTO Donation (ReceiptMain, ReceiptPart, firstName, lastName, telNo, payMode, Amount) VALUES (@rmain, @rpart, fname, lname, telNo, pmode, amt);

 Set @lid := (select max(LAST_INSERT_ID()));
        select concat(ReceiptMain,ReceiptPart) into rno from donation where id = @lid;

 END$$
 DELIMITER ;

答案 1 :(得分:-1)

您可以按如下方式计算下一个OrderNo:

select count(1) + 1 as NextOrderNo
 FROM test
 where date_format(CreatedOn, '%Y') = date_format(current_date(), '%Y')
   and date_format(CreatedOn, '%m') = date_format(current_date(), '%m');

可能将其用于插入语句的子选择。

您应该考虑多线程环境的影响, 在同一个月内可能存在重复的OrderNo值 如果多个线程同时插入。