본문 바로가기

Programming/php

[php] 데이터가 있는 날짜만 select하고 그 사이의 날짜 반환하기(date,date_diff 함수활용)

일정이나 예약을 등록한 날짜들을 mysql에서 select하고 1박2일 이상일 때 예약이 되어있는 날짜를 리턴하는 함수

 

(ex.2022년 1월3일부터 1월8일까지->5박6일/ 2022년 1월20일부터 1월22일까지->2박3일 예약되어있을때,

 2022년 1월의 예약된 날짜(또는 예약이 불가능한) 모두 리턴하기)

 

//일정중 스케줄 데이터가 있는 날짜만 리턴하기
	function getScheduleDay($this_mon=''){
		global $DB;
		$re_arr = array();
        //지정한 년/월이 없으면 현재의 년/월로 지정해주기
		if($this_mon=='')
			$this_mon = date("Y-m");

		$query = "select group_concat(s_date) as s_scd, group_concat(e_date) as e_scd from calendar_tbl where instr(s_date, '{$this_mon}') order by s_date";
		$scd = $DB->fetch_query($query);
		if($scd['s_scd']!='') {
			$scd_s = explode(",", $scd['s_scd']);
			$scd_e = explode(",", $scd['e_scd']);
			$no_arr = array();
			for ($n = 0; $n < count($scd_s); $n++) {
				$no_arr[] = getDaysArray($scd_s[$n], $scd_e[$n], $this_mon);
			}
			for ($i = 0; $i < count($no_arr); $i++) {
				for ($k = 0; $k < count($no_arr[$i]); $k++) {
					$re_arr[] = $no_arr[$i][$k];
				}
			}
			sort($re_arr);
		}
		return $re_arr;
	}
    
//기간 시작일과 종료일 입력하면 그 사이의 날짜 리턴
	function getDaysArray($sdate, $edate, $this_mon){
		$array_days = array();
		$dt_sdate = new DateTime($sdate);
		$dt_edate = new DateTime($edate);
		$dt_lastday = new DateTime(date($this_mon.'-t'));

		//해당월의 마지막 날과 기간시작일 사이의 간격
		$diff = date_diff($dt_sdate, $dt_lastday);
		$date_interval_sdate_ldate = ($diff->days);
		//해당월의 마지막 날과 기간종료일 사이의 간격
		$diff_edate = date_diff($dt_edate, $dt_lastday);
		$date_interval_edate_ldate = $diff_edate->days;

		//마지막 날짜를 기준으로 시작일과의 간격~종료일과의 간격까지 하루씩 마이너스 시켜서 날짜(d)만 배열에 푸시
		for($i=$date_interval_sdate_ldate; $i>=$date_interval_edate_ldate; $i--){
			array_push($array_days, date('d', strtotime(date($this_mon.'-t').' -'.$i.' days')));
		}
		return $array_days;
	}