2015-01-19 7 views
0

이유는 무엇입니까이 반환 '2015년 1월 19일'?MySQL은 최대 날짜 함수와 분 사이에 날짜를 선택

SELECT date 
FROM hours 
HAVING date BETWEEN DATE_SUB(max(date), INTERVAL 2 DAY) AND DATE_ADD(max(date), INTERVAL 1 DAY) 

이 '2015년 1월 20일를'반환 '2015년 1월 19일 2015년 1월 20일 '?

SELECT date 
FROM hours 
HAVING date BETWEEN '2015-01-18' AND '2015-01-21' 

최대 일이다' '모두에 레코드가'2015년 1월 20일 '와'2015년 1월 19일는 '. date는 날짜 필드입니다.

+0

당신이 좀 더 설명 할 수 있습니까? 어느 시나리오에서? '시간'에 어떤 데이터가 있습니까? – Sachin

+0

작업 시간 및 기타 사용자/직원 관련 데이터를 작업 날짜별로 표시합니다. 한 명의 사용자/직원에 대한 특정 날짜에 대해 여러 레코드를 포함 할 수 있습니다. 나는 실제로 날짜가 아니라 날짜 간격으로 *를 반환하려고합니다. 후자의 쿼리 phpmyadmin을 사용하면 실제로 ORDER BY '시간'DESC가 쿼리의 끝에 추가됩니다. 이유를 모른다 ... – Soundwave77

+0

당신은'HAVING date' 전에'GROUP BY date'를 놓는 것을 잊었습니다 .. – Sachin

답변

0

date_sub은 풀 타임 스탬프를 반환합니다. '2008-11-11 13 : 23 : 44.657'자세한 내용은 http://www.w3schools.com/sql/func_date_sub.asp을 참조하십시오.

extract 메서드 또는 date_format (DATE_FORMAT(date_time_var, '%Y-%m-%d'))을 사용하면 between 문에 사용 된 날짜, 월 및 일을 얻을 수 있습니다.

+0

"반환 값은 인수에 의존합니다"[http://dev.mysql.com/doc/refman/ 5.5/ko/date-and-time-functions.html # function_date-add] 결과는 문자열입니다. – Xenos

0

첫 번째 예에는 집계 함수가 포함되어 있습니다. HAVING은 그룹을 필터링하는 수단이기 때문에 일반적으로 GROUP BY가 필요합니다. 따라서 을 HAVING date 앞에두면 19 번째와 20 번째를 모두 얻을 수 있습니다 (첫 번째 SQL 문에 대해).

+0

테스트 및 실패 :''GROUP BY date''는 행을''date'' 값으로 그룹화합니다. 그러므로''MAX (date)''는''date'' 값이고''HAVING'' 절은' 그룹화 된 각 행 집합에 대해 'true'를 반환합니다. ''HAVING''은''GROUP BY''를 요구하지 않습니다. – Xenos

0

그게 HAVING입니다. 첫 번째 쿼리에

HAVING 것이다 그룹 결과 HAVING 절에 그룹 기능 MAX이 있기 때문에. 모든 행은 행 그룹으로 그룹화됩니다 (GROUP BY 명령이 없기 때문에). 따라서 하나의 결과 만 얻습니다. 이 그룹의 date 값은 그룹화 된 행 중 일 수 있습니다. 입니다.

HAVINGHAVING 절 또는 GROUP BY 명령에 그룹화 기능이 없기 때문에 두 번째 쿼리에서 그룹을 사용하지 않습니다.

제안 된대로 GROUP BY date을 추가하면 동일한 date 행이 그룹화됩니다. 따라서 MAX은 모든 날짜의 MAX 대신에 date 값만 반환합니다. 따라서 모든 그룹화 된 행에 MAX(date) == date이 있으므로 모든 행을 검색합니다.


SELECT `date`, GROUP_CONCAT(`date`), (SELECT MAX(`date`) FROM `hours`) AS `md` 
FROM `hours` 
GROUP BY `date` 
HAVING `date` 
BETWEEN DATE_SUB(md, INTERVAL 2 DAY) AND DATE_SUB(md, INTERVAL 1 DAY); 

또한

SELECT `hours`.`date`, `md`.`d` 
FROM `hours`, (SELECT MAX(`date`) AS `d` FROM `hours`) AS `md` 
WHERE `hours`.`date` 
BETWEEN DATE_SUB(`md`.`d`, INTERVAL 2 DAY) AND DATE_ADD(`md`.`d`, INTERVAL 1 DAY); 

확실하지 어느 하나가 가장 빠르게 사용할 수 있습니다 ...

+0

감사합니다! HAVING 이전에 GROUP BY를 넣었으니 매력적입니다. 내가 아는 루키 실수 ... – Soundwave77

+0

@ Soundwave77 한 가지 대답이 트릭을 만든다면 받아들이십시오. – Xenos