2016-11-23 104 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

相關問題