$query = "SELECT distinct user_id FROM `user_data` WHERE date>='□' and date<'□';";
우리의 전략은 위 쿼리의 □ 부분을 바꾸어 가며 여러번 질의하는 것이다.
그러기 위해서는 □ 안에 들어가는 날짜를 한달 후, 두달 후... 와 같이 바꿀 수 있어야 한다.
이를 위해 strtotime()을 사용한다.
엑셀과 마찬가지로 PHP도 2017-01-01 이라는 날짜를 하나의 정수로 만들어 기억한다.
strtotime() 은 우리 눈에 보이는 날짜를 계산할 수 있는 정수로 바꾸어 준다.
다음을 입력해 보자.
$date = strtotime("2017-01-01");
echo $date;
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <?php $date = strtotime("2017-01-01"); echo $date; ?> </body> </html>
결과는 다음과 같다.
2017년 01월 01일이 1483257600 이라는 정수로 바뀌어 기억되고 있다.
만일 여기서 1달 후를 계산하고 싶다면 그대로 안에 +1 month 를 적어주면 된다.
$date = strtotime("2017-01-01 +1 month");
echo $date;
결과는 다음과 같다.
한 달 뒤... 인가보다.
우리가 알아보기 쉬운 형식으로 표기하려면 이 정수를 다시 date() 함수로 변환해 주어야 한다.
date() 함수는 다음과 같이 ①형식 ②값 의 두 가지 인자를 필요로 한다.
년-월-일 은 Y-m-d 로 표기하면 되며, 다른 형식들은 여기에서 확인할 수 있다.
$date = strtotime("2017-01-01 +1 month");
echo date("Y-m-d", $date);
결과는 다음과 같다.
2월이 되었다.
날짜나 주도 계산할 수 있다.
$date = strtotime("2017-01-01 +5 day");
echo date("Y-m-d", $date),"</br>";
$date = strtotime("2017-01-01 +2 week");
echo date("Y-m-d", $date);
결과는 다음과 같다.
이제 strtotime() 과 sprintf() 를 이용하여 쿼리를 변화시켜 보자.
간단히 for 문을 만들고, 안에 날짜를 한 달 뒤, 두 달 뒤로 다음과 같이 변화시켜 출력한다.
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <?php for($i=0; $i<5; $i++){ $date = strtotime("2017-01-01 +$i month"); $date1 = date("Y-m-d", $date); $date = strtotime("2017-01-01 +$i month +1 month"); $date2 = date("Y-m-d", $date); $date = strtotime("2017-01-01 +$i month +2 month"); $date3 = date("Y-m-d", $date); echo $date1,"|",$date2,"|",$date3,"</BR>"; } ?> </body> </html>
결과는 다음과 같다.
다음과 같이 쿼리에 적용시키자.
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <?php for($i=0; $i<5; $i++){ $date = strtotime("2017-01-01 +$i month"); $date1 = date("Y-m-d", $date); $date = strtotime("2017-01-01 +$i month +1 month"); $date2 = date("Y-m-d", $date); $date = strtotime("2017-01-01 +$i month +2 month"); $date3 = date("Y-m-d", $date); $query = "SELECT distinct user_id FROM `user_data` WHERE date>='%s' and date<'%s';"; echo sprintf($query, $date1, $date2), "</BR>"; echo sprintf($query, $date2, $date3), "</BR></BR>"; } ?> </body> </html>
결과는 다음과 같다.
이제 월을 바꾸어가며 쿼리를 질문할 준비가 되었다.
마지막으로 위 코드의 다음 반복되는 부분을 좀 더 예쁘게 다듬어보자.
$date = strtotime("2017-01-01 +$i month");
$date1 = date("Y-m-d", $date);
$date = strtotime("2017-01-01 +$i month +1 month");
$date2 = date("Y-m-d", $date);
$date = strtotime("2017-01-01 +$i month +2 month");
$date3 = date("Y-m-d", $date);
반복문으로는 다음과 같이 표현할 수 있겠다.
for($j=0; $j<3; $j++){
$date = strtotime("2017-01-01 +$i month +$j month");
${'date'.$j} = date("Y-m-d", $date);
}
${'date'.$j} 는 $j 가 0일때 $date0 이라는 변수명이 되며, $j 가 1일때 $date1 이라는 변수명이 된다.
그러므로 아래 부분의 변수명도 다음과 같이 date0 부터 date2 까지로 바꾸어 주어야겠다.
(헛갈린다면 $j =1 ; $j < 4 로 조건을 주자)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <?php for($i=0; $i<5; $i++){ for($j=0; $j<3; $j++){ $date = strtotime("2017-01-01 +$i month +$j month"); ${'date'.$j} = date("Y-m-d", $date); } $query = "SELECT distinct user_id FROM `user_data` WHERE date>='%s' and date<'%s';"; echo sprintf($query, $date0, $date1), "</BR>"; echo sprintf($query, $date1, $date2), "</BR></BR>"; } ?> </body> </html>
물론 결과는 동일하다.
하지만 이렇게 반복문 안에서 계속 새로운 변수를 만드는 것보다는
차라리 다음과 같이 배열로 만드는 편이 낫다.
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <?php for($i=0; $i<5; $i++){ $date_array = array(); for($j=0; $j<3; $j++){ $date = strtotime("2017-01-01 +$i month +$j month"); $date_array[$j] = date("Y-m-d", $date); } $query = "SELECT distinct user_id FROM `user_data` WHERE date>='%s' and date<'%s';"; echo sprintf($query, $date_array[0], $date_array[1]), "</BR>"; echo sprintf($query, $date_array[1], $date_array[2]), "</BR></BR>"; } ?> </body> </html>
이제 다음 포스트에서 실제로 쿼리를 질의하고 결과를 출력해 보자.
'PHP' 카테고리의 다른 글
[PHP] $i++ 과 ++$i 의 차이 (0) | 2018.06.21 |
---|---|
[PHP] 에러메시지 Undefined offset 의미 (0) | 2018.06.20 |
[PHP] 바이너리 서치로 인덱스 필드값 찾기 (0) | 2018.05.15 |
[PHP] 회원들의 재구매율 알아보기(4) - 완성 (0) | 2017.10.13 |
[PHP] 회원들의 재구매율 알아보기(2) - 두 배열 비교하기 in_array() (0) | 2017.09.25 |
[PHP] 회원들의 재구매율 알아보기(1) - MySQL 컬럼(열)을 배열로 만들기 (0) | 2017.09.24 |
[PHP] mysqli_fetch_row, assoc, array 의 차이 (4) | 2017.09.20 |
[PHP] DB에서 특정 행들만 가져오기(8) - DB 에서 열 이름 가져오기 (0) | 2017.09.19 |
[PHP] DB에서 특정 행들만 가져오기(7) - DB에서 가져온 정보 출력하기 mysqli_fetch_row() (0) | 2017.09.18 |
[PHP] DB에서 특정 행들만 가져오기(6) - 쿼리 작성하기 mysqli_query() (0) | 2017.09.17 |
댓글