마스터포유(Master4U)
Monday, 17 of January
 

로그인 Category
금주의 게시물 SQL로 한큐에 뽑아내기!
관리자  2010-12-23 03:26:51 Hit:3663
링크 #1: http://jjjboard.com/zb/zboard.php?id=mysql&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=10

금주의 게시물 SQL로 한큐에 뽑아내기!

(2004-11-04 21:44:47, Hit : 10264, Vote : 341)

1> 시작하기에 앞써 잘못된 생각 바로잡기
1.1> 한주의 시작은 일요일이다.
-> 어떤분들은 월요일이 한주의 시작인것으로 알고있지만 한주의 시작은 일요일입니다.

2> 실전에 앞써...
2.1> MySQL에서 날짜관련 함수

2.1.1> DATE_ADD(a, INTERVAL b DAY)
-> a날짜에서 b날만큼 더한다.

2.1.2> DATE_SUB(a, INTERVAL b DAY)
-> a날짜에서 b날만큼 뺀다.

2.1.3> CURDATE()
-> 현재 날짜를 출력한다. cf> NOW() 함수는 현재날짜 및 현재 시간을 출력한다.

2.1.4> DAYOFWEEK(a)
-> a날짜가 위치한 요일의 주(weekday) 인덱스값을 출력한다. ex>일=1, 월=2, 토=7

3> 실전연습

3.1> 이번주 첫 날짜만 알아내기(날짜기준)
SELECT DATE_SUB(CURDATE(), INTERVAL(DAYOFWEEK(CURDATE()) - 1) DAY)

3.2> 현재시각 기준으로 첫 날짜 및 시간 알아내기(현재시각 기준)
SELECT DATE_SUB(NOW(), INTERVAL(DAYOFWEEK(NOW()) - 1) DAY)

3.3> 이번주 끝 날짜만 알아내기(날짜기준)
SELECT DATE_ADD(CURDATE(), INTERVAL(7 - DAYOFWEEK(CURDATE())) DAY)

3.4> 현재시각 기준으로 끝 날짜 및 시간 알아내기(현재시각 기준)
SELECT DATE_ADD(NOW(), INTERVAL(7 - DAYOFWEEK(NOW())) DAY)

잘 보시면...
CURDATE() 가 NOW() 로 바뀌신것을 알수 있습니다.
테이블을 구성하실때 필드타입 선언에 있어서 이것이 좀 중요한 이유는...

예를들면 날짜가 DATETIME, 즉 '2004-01-17 13:45:12' 로 기록되어 있는데...
시작날짜하고 끝 날짜만 알아내서 비교구문(between)을 때린다면...
분명 끝일에 해당하는 리스트들은 출력하고자 하는 리스트에서 제외될것입니다.
왜냐하면
끝 날짜 '2004-01-17' 을 '2004-01-17 00:00:00'으로 인식하기 때문이죠...
분명 '2004-01-17 00:00:00'는 같은 1월 17일 이긴 하지만...
'2004-01-17 13:45:12' 보다는 작습니다.
이해하셨는지 모르겠네여...
필드의 날짜 포맷에 따라 SQL을 적절히 조절할 필요가 있습니다.

아무튼...
특정날짜에 대해서 출력하려면...
CURDATE() 부분에 특정날짜를 넣어주면 되겠죠?
예를들어 2004년 1월 15일의 그 주 시작일과 끝일을 알고싶다면

시작일 : SELECT DATE_SUB('2004-01-15', INTERVAL(DAYOFWEEK('2004-01-15') - 1) DAY)

끝일 : SELECT DATE_ADD('2004-01-15', INTERVAL(7 - DAYOFWEEK('2004-01-15')) DAY)

이해하셨는지 모르겠군여...^^;
자...
orderlist(주문리스트) 란 테이블에 orderday(주문일) 라는 필드가 있고
orderday는 DATE 타입, 즉 '2004-02-10' 형태로 기록될 때 주문일이 금주인 주문리스트만 추출하고 싶다면 아래와 같이 하면 되겠죠?

SELECT * FROM orderlist WHERE orderday BETWEEN DATE_SUB(CURDATE(), INTERVAL(DAYOFWEEK(CURDATE()) - 1) DAY) AND DATE_ADD(CURDATE(), INTERVAL(7 - DAYOFWEEK(CURDATE())) DAY)

이상입니다. ^^;

P.S>
분명 필드의 DATE 포맷에 따라 SQL을 적절히 조절하셔야 한다고 말씀드렸구요...
위의 SQL은 필드타입이 DATE 일때 적용될 수 있습니다.
이해하셨길 바라며...^^;

EX)
//-- 15일 이전의 데이타 뽑기.
$SQL = "select * from table_name Where DATE_FORMAT(regdate ,'%Y-%m-%d' ) < DATE_SUB(CURDATE(), INTERVAL 15 DAY) ";

-- add --
`DATE_ADD(date,INTERVAL expr type)'
`DATE_SUB(date,INTERVAL expr type)'
`ADDDATE(date,INTERVAL expr type)'
`SUBDATE(date,INTERVAL expr type)'


`type' *value* *Expected* `expr' *format*
`SECOND' `SECONDS'
`MINUTE' `MINUTES'
`HOUR' `HOURS'
`DAY' `DAYS'
`MONTH' `MONTHS'
`YEAR' `YEARS'
`MINUTE_SECOND' `"MINUTES:SECONDS"'
`HOUR_MINUTE' `"HOURS:MINUTES"'
`DAY_HOUR' `"DAYS HOURS"'
`YEAR_MONTH' `"YEARS-MONTHS"'
`HOUR_SECOND' `"HOURS:MINUTES:SECONDS"'
`DAY_MINUTE' `"DAYS HOURS:MINUTES"'
`DAY_SECOND' `"DAYS HOURS:MINUTES:SECONDS"'
본문인쇄본문메일발송
MySQL 기본개념 [1]
테이블(Table) 복사...데이타 포함
Copyright 1999-2019 Zeroboard / skin by ChanBi