2013-08-18 2 views
1

나는 here과 같은 사람을 찾고 있습니다. 단지 MySQL을 사용하고 싶습니다. 아래 표는 내 데이터베이스 (단순화 된)에서 찾을 수있는 내용입니다. 우선 항목의다른 두 날짜 사이의 날짜, 무시 연도

+------+------+------+------+ 
| 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로 가지고 있으며 나는 단지 한 항목을합니다. 나는 그것을 해결했다 : SELECT * FROM test WHERE id <> 4 ORDER BY rand() LIMIT 1.

이 표에서 'first'및 'last'열은 mmdd (두 정수)로 형식이 지정된 날짜입니다. 그래서 John은 일 년 내내 이용 가능합니다. 10 월 20 일부터 8 월 14 일까지 Zara는 다른 한편으로는 작은 기간 동안 만 사용할 수 있습니다. 12 월 1 일 ~ 12 월 19 일.

내 질문 : 사용 가능한 사람 만 선택하도록 내 쿼리를 변경하려면 어떻게해야합니까? 존의 경우 1020과 0814 사이에는 아무것도 없으므로 '사이'는 사용할 수 없습니다.

비슷한 문제가있는 다른 사람들이있을 것입니다. 해결책?

친절한 답변

+0

그래서 정수가 아닌 날짜로 저장됩니다 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을 더하는 것으로는 충분하지 않습니다. John의 경우 0101은 1020에서 0814 사이로 간주해야하지만 1020에서 10814 사이가 아닙니다. – Barmar

답변

3

두 가지 경우를 구별해야합니다.

  1. first < last 일 경우 날짜는 같은 해입니다. between을 사용하여 날짜와 일치시킬 수 있습니다.

  2. first > last 일 경우 last은 다음 해를 의미합니다. 이 경우 일치하는 날짜는 date >= first OR date <= last입니다.

그래서 조항이 있어야 할 곳에 :

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

특수한 경우에 '마지막 <첫 번째'이후 특별한 경우는 '처음과 마지막 사이'여야하지 않습니까? – GreatBigBore

+0

@GreatBigBore 1020에서 0814 사이에는 숫자가 없습니다. – Barmar

+0

내 비교 방법의 방향이 잘못되었습니다. 나는 그것을 고쳤다. – Barmar

관련 문제