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

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

Copy
$holy_data = "select * from holydata";

 

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

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

Copy
$chkDate = '2021-01-06';


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

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개

정말 감사합니다.. 잘되네요

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

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

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

[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개

친절한 답변 다시한번 감사드립니다.

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

Copy
$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))));
}

$n = date("N", strtotime($tmp_date));

if($n < 6) {
    $return_date = $tmp_date;
} else {
    $return_date = date("Y-m-d", strtotime((8 - $n)." day", strtotime($tmp_date)));
}

echo $return_date;
로그인 후 평가할 수 있습니다

답변에 대한 댓글 3개

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

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

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

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

<?php
$holy = ['2021-01-06','2021-01-07','2021-01-08'];

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

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

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

$chkDate = '2021-01-05'; // 평일
$chkDateReturn = get_date($chkDate);
echo "휴무일 : ".$chkDate."<br />";
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");
        $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개

친절한 답변 감사합니다만..

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

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

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

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

로그인
🐛 버그신고