본문 바로가기
PHP

[PHP] 회원들의 재구매율 알아보기(3) - 날짜 계산하기 strtotime()

by LightBlogger 2017. 9. 26.

$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>


이제 다음 포스트에서 실제로 쿼리를 질의하고 결과를 출력해 보자.




반응형

댓글