금주의 또는 한 시간 이내의 게시물 뽑아내기! > MySQL

본문 바로가기
사이트 내 전체검색

MySQL

금주의 또는 한 시간 이내의 게시물 뽑아내기!

페이지 정보

profile_image
작성자 최고관리자
댓글 0건 조회 4,938회 작성일 21-02-10 17:15

본문

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) ";
 

//-- 한시간 한 시간 이내의 데이타 뽑기

$SQL = "select * from table_name where regdate >= DATE_SUB(now(), INTERVAL 1 HOUR)";


-- 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"'

-----------------------------------------------------
어떤 날짜를 기준으로 기간 이전기간 이후기간 특정일 등등등

$ 7일후
select DATE_FORMAT(DATE_ADD(regdate, INTERVAL 7 DAY),'%Y%m%d') from 기존테이블명

# 7일전
$daysub7= date("Ymd",strtotime("-7 day")); 

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

  • 게시물이 없습니다.

접속자집계

오늘
1,809
어제
2,020
최대
6,642
전체
1,120,632
contact : webmaster@beautipia.co.kr
Copyright © beautipia.co.kr. All rights reserved.