테스트 사이트 - 개발 중인 베타 버전입니다

공휴일 체크 sql 질문입니다. 채택완료

humanb2box 4년 전 조회 3,801

1. 공휴일 데이터를 가져옵니다.

</p>

<p>$holy_data = "select * from holydata";</p>

<p> </p>

<p>$holy = ['2021-01-06','2021-01-07','2021-01-08'];</p>

<p>

 

 

2. 비교할 데이터(2021-01-06)을 넣어서 공휴일에 해당하면 +1일을 합니다.

</p>

<p>$chkDate = '2021-01-06';</p>

<pre>
foreach ($holy as $key => $row) {
    if ($chkDate == $row['HOLIDAY']) {
        // 공휴일이라면 ON
        $timestamp = strtotime($chkDate." +1 days");
        $return_date = date("Y-m-d", $timestamp);
    }
}</pre>

<p>

 

 

4. 결과가 주말에 해당한다면 토요일은 +2일 일요일이라면 +1일을 하여 평일로 바꿉니다.

 

제가 원하는 결과는 2021-01-11입니다.

왜냐하면 6일부터 8일은 임의로 설정한 공휴일이고 9일부터 10일은 주말에 해당하기 때문입니다..

 

근데 결과는 2021-01-07일로 나옵니다.. 코드를 봐선 당연히 7일로 나와야하는데

 

어떻게하면 8일까치 체크하게 할수 잇을까요?

 

도움좀 부탁드립니다.

 

 

 

댓글을 작성하려면 로그인이 필요합니다.

답변 4개

채택된 답변
+20 포인트

2021-01-11

 

=> 휴무일이라면 다음주 월요일이 나온다는건가요?

=> 설명상으로 왜 해당 날짜가 나온다는 이유가 안 보이네요.

 

// 공휴일이라면 1일 추가                 $is_holy = 1;                 $day_plus = 7 - $chkDateYoil + 1;                 $timestamp = strtotime($chkDate." +".$day_plus." days");                 $return_date = date("Y-m-d", $timestamp);

 

=> 공휴일 부분을 이렇게 고치시면 될거 같네요.

로그인 후 평가할 수 있습니다

답변에 대한 댓글 2개

h
humanb2box
4년 전
정말 감사합니다.. 잘되네요

근데 $day_plus = 7 - $chkDateYoil + 1; 이부분이 정말 이해가 안됩니다.

쉬워보이는데 해당 부분이 어떻게 공휴일 배열을 모두 체크할수 잇는건가요? ㅠ

설명부탁드려도될까요.
h
humanb2box
4년 전
한가지 오류가 생긴거같은데 하루종일 이것만봐도 해결이 안됩니다..

[code]


$holy = [
'2020-12-23',
'2020-12-24',
'2020-12-25',
'2020-12-28',
];



$chkDate = '2020-12-23'; // 휴무일
$chkDateReturn = get_date($chkDate);

echo "휴무추가 : " . $chkDateReturn . "<br />";
echo "<br />";


function get_date($chkDate)
{
global $holy;

$chkDateYoil = date("w", strtotime($chkDate)); // 토요일(6), 일요일(0)


if ($chkDateYoil == 6) {
// 토요일은 2일 추가
$timestamp = strtotime($chkDate . " +2 days");
$chkDate = date("Y-m-d", $timestamp);

} else if ($chkDateYoil == 0) {
// 일요일은 1일 추가
$timestamp = strtotime($chkDate . " +1 days");
$chkDate = date("Y-m-d", $timestamp);

}
// 평일인경우 휴무일 비교
foreach ($holy as $key => $holyday) {
if ($chkDate == $holyday) {
// 공휴일이라면 1일 추가
$day_plus = 8 - $chkDateYoil;
$timestamp = strtotime($chkDate." +".$day_plus." days");
$chkDate = date("Y-m-d", $timestamp);
}

}


return $chkDate;
}
[/code]

주말을 지나 월요일(12월 28일)까지 휴무일로 지정되어도

12월 29일로 아웃풋이 나와야하는데 21년 1월 2일로 나온느데 왜그런지 도무지 모르겟습니다..

댓글을 작성하려면 로그인이 필요합니다.

$chkDateYoil = date("w", strtotime($chkDate)); // 토요일(6), 일요일(0)

=> 요일을 숫자로 변경

=> 월(1), 화(2) ~ 토(6), 일(0)

$day_plus = 7 - $chkDateYoil + 1;

=> 일주일 - (현재요일숫자) + (월요일이므로 하루더함)

=> 월요일을 예로 들면 숫자가 1이므로 해당 날짜에서 6일을 더한후 +1일을 하면 다음주 월요일

=> 7일에서 해당 날짜의 요일숫자를 뺀 숫자를 더하면 그주 일요일이고 거기에 1을 더해서 월요일

=> 간단하게 하면 

=> $day_plus = 8 - $chkDateYoil;

=> 이렇게 해도 될거 같네요 $timestamp = strtotime($chkDate." +".$day_plus." days"); $return_date = date("Y-m-d", $timestamp);

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

h
humanb2box
4년 전
친절한 답변 다시한번 감사드립니다.

댓글을 작성하려면 로그인이 필요합니다.

</p>

<p>$holy = ['2021-01-06','2021-01-07','2021-01-08'];

$return_date = $tmp_date = $chkDate = "2021-01-06";

if(in_array($chkDate, $holy) === true) {

    $tmp_date = date("Y-m-d", strtotime("+1 day", strtotime(end($holy))));

}</p>

<p>$n = date("N", strtotime($tmp_date));</p>

<p>if($n < 6) {

    $return_date = $tmp_date;

} else {

    $return_date = date("Y-m-d", strtotime((8 - $n)." day", strtotime($tmp_date)));

}</p>

<p>echo $return_date;</p>

<p>

로그인 후 평가할 수 있습니다

답변에 대한 댓글 3개

h
humanb2box
4년 전
쟁반짜장님도 8을 빼셧네요.. 왜 저는 이해가 안될까요 설명좀 부탁드려도될까요
쟁반짜장
4년 전
date("Y-m-d", strtotime((8 - $n)." day", strtotime($tmp_date)));
여길 말씀하시는 거 같네요.
https://www.php.net/manual/en/function.strtotime.php#refsect1-function.strtotime-examples
여길 보시면 이해가 갈 겁니다.

* 지금 제가 남긴 코드는 보니 오류가 있네요.
h
humanb2box
4년 전
그래도 친절히 링크도 주시고 감사드립니다.

수포자 였던게 한이됩니다.. 감사합니다.

댓글을 작성하려면 로그인이 필요합니다.

 

$chkDate = '2021-01-02'; // 토요일 $chkDateReturn = get_date($chkDate); echo "토요일 : ".$chkDate." "; echo "토요일 휴무추가 : ".$chkDateReturn." "; echo " ";

 

$chkDate = '2021-01-03'; // 일요일 $chkDateReturn = get_date($chkDate); echo "일요일 : ".$chkDate." "; echo "일요일 휴무추가 : ".$chkDateReturn." "; echo " ";

 

$chkDate = '2021-01-06'; // 휴무일 $chkDateReturn = get_date($chkDate); echo "휴무일 : ".$chkDate." "; echo "휴무추가 : ".$chkDateReturn." "; echo " ";

 

$chkDate = '2021-01-05'; // 평일 $chkDateReturn = get_date($chkDate); echo "휴무일 : ".$chkDate." "; echo "휴무추가 : ".$chkDateReturn." "; echo " ";

 

function get_date($chkDate) {     global $holy;

    $chkDateYoil = date("w", strtotime($chkDate)); // 토요일(6), 일요일(0)

    if ($chkDateYoil == 6) {         // 토요일은 2일 추가         $timestamp = strtotime($chkDate." +2 days");         $return_date = date("Y-m-d", $timestamp);     } else if ($chkDateYoil == 0) {         // 일요일은 1일 추가         $timestamp = strtotime($chkDate." +1 days");         $return_date = date("Y-m-d", $timestamp);     } else {         // 평일인경우 휴무일 비교         $is_holy = 0;         foreach ($holy as $key => $row) {             if ($chkDate == $row) {                 // 공휴일이라면 1일 추가                 $is_holy = 1;                 $timestamp = strtotime($chkDate." +1 days");                 $return_date = date("Y-m-d", $timestamp);             }         }         if ($is_holy == 0) {             // 휴무일이 아닌경우 해당날짜로 리턴             $return_date = $chkDate;         }     }

    return $return_date; } ?>

 

이렇게 하시면 될거 같네요

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

h
humanb2box
4년 전
친절한 답변 감사합니다만..

휴무일 : 2021-01-06
휴무추가 : 2021-01-07

이렇게 나옵니다. 2021-01-11 이렇게 나와야 하거든요

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인