我正在制作一个C#项目,我需要帮助来生成和插入MySQL数据库中的字段。
161013001
其中:
16是年,
10是月,
13是天
和001是每天重置的自动递增数字。
例如
161012-001
161012-002
161012-002
161013-001
161013-002
161014-001
161014-002
161014-003
161014-004
161014-005
161015-001
请指导我如何使ID每天重置并从每天1开始。
答案 0 :(得分:1)
此处同时添加了MySQL和SQL Server实现,
MySQL:
DROP TEMPORARY TABLE TempDate;
CREATE TEMPORARY TABLE TempDate(
Id VARCHAR(50),
Comments VARCHAR(50)
);
INSERT INTO TempDate(Id,Comments)
SELECT '190630-001', '1'
UNION
SELECT '190630-002', '2'
UNION
SELECT '190701-001', '1'
UNION
SELECT '190701-002', '2'
UNION
SELECT '190701-003', '3';
SET @v_ToDay = '';
SET @v_ToDay = (SELECT date_format(current_date(),'%y%m%d'));
SET @v_TotalByDay = '' ;
SET @v_TotalByDay =(
SELECT CONCAT('000',CAST(CASE WHEN COUNT(1) = 0 THEN 1 ELSE COUNT(1)+1 END as CHAR))
FROM TempDate
WHERE LEFT(Id,6) = @v_ToDay);
SELECT CONCAT(@v_ToDay, '-', CASE WHEN CHAR_LENGTH(RTRIM(@v_TotalByDay)) > 3 THEN RIGHT(@v_TotalByDay,3) ELSE @v_TotalByDay END) as NewIdColumn
SQL Server:
DECLARE @TempDate TABLE(
Id NVARCHAR(50),
Comments NVARCHAR(MAX)
)
INSERT INTO @TempDate(Id,Comments)
SELECT '190630-001', '1'
UNION
SELECT '190630-002', '2'
UNION
SELECT '190701-001', '1'
UNION
SELECT '190701-002', '2'
UNION
SELECT '190701-003', '3'
DECLARE @ToDay NVARCHAR(20) = (SELECT CONVERT(NVARCHAR(6), GETDATE(), 12))
DECLARE @TotalByDay NVARCHAR(20) = ''
SELECT @TotalByDay = '000' + CAST(CASE WHEN COUNT(1) = 0 THEN 1 ELSE COUNT(1)+1 END as NVARCHAR(20) )
FROM @TempDate
WHERE LEFT(Id,6) = @ToDay
SELECT @ToDay + '-' + CASE WHEN LEN(@TotalByDay) > 3 THEN RIGHT(@TotalByDay,3) ELSE @TotalByDay END as NewIdColumn
答案 1 :(得分:0)
我的情况与这个问题稍有不同....
我有一个旧数据库(不是仅用于报告操作的数据库) 目的..)
该数据库事务表中的是一个自动增量tranx id列。 像1,2,3 ......但是现在我们的新报告需要有意义的tranx id
(yyMMDD<count of that day>)
喜欢这个问题。所以实际上我需要一个 选择查询来解决此问题。
借助@Khairul的逻辑,我解决了我的问题....
我分享了我对他人帮助的解决方案。...
SELECT
trnx_id, account_id, pay_amount,counter_id, trantime, trandate
FROM(
SELECT
@id:=IF(@prev != t.trandate, @rownum:=1, @rownum:=@rownum+1)
,@prev:=t.trandate
,CONCAT(
SUBSTR(YEAR(t.`trandate`),3) -- year
,IF(LENGTH(MONTH(t.`trandate`))=1,CONCAT('0',MONTH(t.`trandate`)),MONTH(t.`trandate`)) -- month
,IF(LENGTH(DAY(t.`trandate`))=1,CONCAT('0',DAY(t.`trandate`)),DAY(t.`trandate`)) -- day
,IF(LENGTH(@id)=1,CONCAT('000',@id),IF(LENGTH(@id)=2,CONCAT('00',@id),IF(LENGTH(@id)=3,CONCAT('0',@id),@id))) -- count
) AS trnx_id
,t.*
FROM tax_info t ORDER BY t.`trandate`, t.`trantime`
) AS te
我的查询结果是..........
解决我的问题后,我尝试解决此问题....... 为此,我将触发器用于输入自动增量自定义列... 我的代码在下面,我的付款列中有一个自定义的tranx ID ....
DELIMITER $$
DROP TRIGGER tranxidGeneration$$
CREATE
TRIGGER tranxidGeneration BEFORE INSERT ON payment
FOR EACH ROW BEGIN
DECLARE v_tranx_id_on INT;
-- count total row of that day
select IFNULL(COUNT(tranx_id),0)+1 Into v_tranx_id_on from payment where SUBSTR(tranx_id,1,6) = DATE_FORMAT(NOW(), "%y%m%d");
-- set custom generate id into tranx_id column
SET NEW.tranx_id := CONCAT(DATE_FORMAT(NOW(), "%y%m%d"),LPAD(v_tranx_id_on,4,0)) ;
END;
$$
DELIMITER ;