2013-08-18 85 views
1

我正在尋找像here正在尋找的人,只有我想使用MySQL。下表是您在我的數據庫中找到的內容(簡化)。2個其他日期之間的日期,不考慮年份

+------+------+------+------+ 
| id | name | first| last | 
+------+------+------+------+ 
| 1 | John | 1020 | 0814 | 
| 2 | Ram | 0827 | 0420 | 
| 3 | Jack | 0506 | 0120 | 
| 4 | Jill | 0405 | 0220 | 
| 5 | Zara | 1201 | 1219 | 
+------+------+------+------+ 

首先,條目必須是隨機的,而不是id 4,我只想要1條目。我解決了這個問題:SELECT * FROM test WHERE id <> 4 ORDER BY rand() LIMIT 1

在此表中,列'第一'和'最後'是格式爲mmdd(均爲整數)的日期。所以約翰一年中的大部分時間都可以使用;從10月20日到8月14日。另一方面,Zara只能在一段時間內使用; 12月1日至12月19日。

我的問題:如何將我的查詢更改爲僅選擇可用人員?我不能使用「之間」,因爲在約翰的情況下,1020和0814之間沒有任何東西。

我只是無法弄清楚,必須有其他人有類似的問題......有沒有人一個辦法?

親切的問候

+0

所以'first'和'last'被存儲爲整數而非日期?爲什麼在last-values之後有一些第一個值?在這種情況下,您如何知道如何搜索first> last或last> first?我還假定你的意思是10月20日。 –

+0

如果您首先將「日期」轉換爲實際的MySQL「DATE」值,那麼您可以使用'BETWEEN'。你可以用['STR_TO_DATE()'](https://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html#function_str-to-date):'STR_TO_DATE (首先,'%m%d')'。 @AndyG筆記的問題依然存在。 –

+0

@GreatBigBore將10000添加到最後是不夠的。在約翰的情況下,0101應該在1020年和0814年之間考慮,但它不在1020年到10814年之間。 – Barmar

回答

3

您需要區分兩種情況。

  1. first < last,日期是在同一年。然後您可以使用between來匹配日期。

  2. first > last,這意味着last是在下一年。在這種情況下,匹配的日期是date >= first OR date <= last

所以,你的WHERE子句應該是:

WHERE IF(first < last, @date BETWEEN first AND last, 
         @date >= first OR date <= last) 
+0

特殊情況下,由於「last GreatBigBore

+0

@GreatBigBore 1020到0814之間沒有數字。 – Barmar

+0

雖然我確實弄錯了我的比較方向。我修復了它。 – Barmar

相關問題