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

본문 바로가기

사이트 내 전체검색

뒤로가기 PHP

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

페이지 정보

작성자 최고관리자 작성일 21-02-09 11:39 조회 5,451 댓글 0

본문

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 일때 적용될 수 있습니다.
이해하셨길 바라며...^^;

 ##################################################
최근 일주일 자료들
$dayago7=date('Y-m-d',(time()-(86400*6)));
 where date_format(regdate,'%Y-%m-%d') >= '$dayago7'

또는
where date_format(regdate,'%Y-%m-%d')  >=  DATE_SUB(CURDATE(), INTERVAL 7 DAY)



이번주가 해당월의 몇째주차인지 뽑아오기....

 <?
 $connect = db_connect("test");

 // 해당월의 몇주차인지 찾아내기
function MonthWeek($tmpweek)
 {
    Global $connect;
    //해당월의 1일 날짜 구하기
    $fsql = "select DAYOFWEEK('{$tmpweek[0]}-{$tmpweek[1]}-01')";
    $fresult = mysql_query($fsql);
    $frow = mysql_fetch_array($fresult);
   
    $reval[vmon] = (int)$tmpweek[1];
    $sday = 1;
    $stopdate = (int)$tmpweek[2];
   
    if($frow[0] == 2 || $frow[0] == 3 || $frow[0] == 4 || $frow[0] == 5)
    {
                  for($i=1;$i<7;$i++)
                  {
                              $pluscha = ($i == 1)?7-$frow[0]+2:7;
                              $sday += $pluscha;
                              if($stopdate < $sday) break;
                  }
                  $vweek = $i;
    }
    else
    {
                  for($i=0;$i<6;$i++)
                  {
                              $pluscha = ($i == 0)?7-$frow[0]+2:7;
                              $sday += $pluscha;
                              if($stopdate < $sday) break;
                  }
                  $vweek = $i;
    }
    $reval[vweek] = (int)$vweek;
    return $reval;
 }


 //시작일  (한 주간은 월요일부터 ~ 일요일까지로 <-- 클라이언트의 요구였음.)
 $ssql = "SELECT DATE_SUB(CURDATE(), INTERVAL (DAYOFWEEK(CURDATE()) - 2) DAY) as sdate";
 $sresult = mysql_query($ssql);
 $srow = mysql_fetch_array($sresult);
 $sdate = $srow[sdate];

 //끝나는일
$esql = "select DATE_FORMAT(DATE_ADD('$sdate', interval 6 day),'%Y-%m-%d') as edate";
 $eresult = mysql_query($esql);
 $erow = mysql_fetch_array($eresult);
 $edate = $erow[edate];

 $tmpweekstart = explode("-",$sdate);
 $tmpweekend = explode("-",$edate);


 $tmpweek = $tmpweekstart;  // 해당월의 기준달

// 시작일 끝나는일 같은달인경우
if($tmpweekstart[1] != $tmpweekend[1])
 {
    $fsql = "select DAYOFWEEK('{$tmpweekend[0]}-{$tmpweekend[1]}-01')";
    $fresult = mysql_query($fsql);
    $frow = mysql_fetch_array($fresult);
   
    if($frow[0] == 2 || $frow[0] == 3 || $frow[0] == 4 || $frow[0] == 5)
    {  //매월 1일의 시작일이 월화수목 일경우 첫째주로 함... 금토일은 이전달의 마지막주로 함
                $tmpweek = $tmpweekend;
    }
 }
 $monweekcul = MonthWeek($tmpweek);
 // 해당주간의 차수뽑기 end
         
 echo "이번주는 {$monweekcul[vmon]}월 {$monweekcul[vweek]}주차(" . (int)$tmpweekstart[2]."일~".(int)$tmpweekend[2]."일) 입니다";

 ?>



 #######  오늘의 일주일 전의 날짜 계산...
1. mysql query
 $sql = "SELECT DATE_SUB(CURDATE(), INTERVAL 7 DAY)";
 $result = mysql_query($sql);
 $row = mysql_fetch_array($result);
 $weekago = $row[0];

 2. time
 $weekago= date('Y-m-d',(time()-(86400*7)));       

 3. strtotime
 $weekago= date('Y-m-d',strtotime("-7 day"));

댓글목록 0

등록된 댓글이 없습니다.

Copyright © beautipia.co.kr. All rights reserved.

contact : webmaster@beautipia.co.kr

PC 버전으로 보기