2016-11-23 66 views
0

这是我无法解决的问题: 我有一个关于交易表的特殊索引号,我每年重置这个特殊索引号。这里是代码。如何检查给定的日期是在表记录范围

SELECT IFNULL(MAX(Index),0)+1 as Index_Number FROM Transactions WHERE YEAR(Create_Date) = '2016' 

我有这个查询没有问题,其作品fine.If我们认为,记录数据的日期是:

id | index | create_date 
1 | 7 | 2016-01-01 
2 | 8 | 2016-01-03 

当日期2016年1月2日输入数据时,ID 2的索引数必须9.新添加的数据的索引号必须为8

换句话说,最终状态应当是:

id | index | create_date 
    1 | 7 | 2016-01-01 
    3 | 8 | 2016-01-02 
    2 | 9 | 2016-01-03 

我该怎么做?

我忘记提及索引号根据每个人而不同,所以我不能使用auto_increment。

+0

为什么要使用在AUTO_INCREMENT‘指数’列? – 2oppin

+0

我可以建立一个每年可以重置的结构,并且可以按照我上面提到的进行排序吗? – ccoeder

+0

所以在添加“2016-01-02”后,您的索引为“2016-01-03”sholud被更改? 如果是这样的话,你有两种方法:一种 - 在索引中添加这样的步骤的行,你总能找到可能插入的索引值;另一种是执行3个查询:查找所需的索引(在我们的测试案例8中),将所有索引> = 8,最后插入新行。 但你提到后,怀疑“索引”可能不是一个数字? – 2oppin

回答

0

根据你的榜样应该是这样的:

set @userinput = '2016-01-02'; 
set @i = (SELECT ifnull(min(index),1) FROM FROM Transactions WHERE YEAR(Create_Date) = '2016') and Create_Date > @userinput; 
update Transactions set index = index+1 WHERE YEAR(Create_Date) = '2016') and index >= @i; 
insert into Transactions (`index`,`Create_Date`) values (@i, @userinput); 

所以首先你搜索分指数的日期是随后进入较大(在某些年),

那么你更新所有“指数”为具有更大的日期,但同年行,转移它

最后你插入新行

+0

该代码完全按照我希望的方式工作,非常感谢您,但是如果用户在数据库中没有日期,它将返回空值。是否有机会将我在上面使用的代码(在此计算“索引”编号)整合在一起?例如,如果用户在日期“2016-01-04”中输入数据,则“空白”记录“索引”号码。 – ccoeder

+0

已更新。你总是可以用“IFNULL”功能,另外你可以将它插入〜IFNULL(@我,1) – 2oppin

+0

我想说的是,由用户输入(本例中的记录,“2016年1月4日“)需要重新计算,如果它不在两个日期之间(例如查询中的”2016-01-02“)。在这种情况下,使用初始查询将解决问题。再次感谢你。 – ccoeder

相关问题