JavaScript 특정 시간 자동 실행 node-cron

·2023년 5월 25일
post-thumbnail
cron.shedule('mm hh * * *')

hh시간 mm분마다 실행
9분인 경우 09가 아니라 9로 표기

// 매일 특정 시간에 WaitingTotal_Hour 테이블, WaitingTotal_Date 테이블 업데이트
cron.schedule('40 16 * * *', () => {
  updateWaitingTotalHour();
  updateWaitingTotalDate();
  console.log('매일 자정마다 작업 실행:', new Date().toString());
});

function updateWaitingTotalHour() {
  const sql = 'SELECT resPhNum, Hour(WaitTime) as WaitTime FROM Waiting';
  connection.query(sql, (err, rows, fields) => {
    if (err) {
      console.log(err);
    } else {
      rows.forEach((row) => {
        const resPhNum = row.resPhNum;
        const WaitTime = row.WaitTime;
        if (!resPhNum) { // resPhNum이 null인지 확인
          console.log('resPhNum이 null인 행을 건너뜁니다.');
          return;
        }
        let hour;
        // 분기문을 사용하여 WaitTime에 따라 적절한 칼럼 선택
        if (WaitTime >= 0 && WaitTime < 2) {
          hour = 0;
        } else if (WaitTime >= 2 && WaitTime < 4) {
          hour = 2;
        } else if (WaitTime >= 4 && WaitTime < 6) {
          hour = 4;
        } else if (WaitTime >= 6 && WaitTime < 8) {
          hour = 6;
        } else if (WaitTime >= 8 && WaitTime < 10) {
          hour = 8;
        } else if (WaitTime >= 10 && WaitTime < 12) {
          hour = 10;
        } else if (WaitTime >= 12 && WaitTime < 14) {
          hour = 12;
        } else if (WaitTime >= 14 && WaitTime < 16) {
          hour = 14;
        } else if (WaitTime >= 16 && WaitTime < 18) {
          hour = 16;
        } else if (WaitTime >= 18 && WaitTime < 20) {
          hour = 18;
        } else if (WaitTime >= 20 && WaitTime < 22) {
          hour = 20;
        } else if (WaitTime >= 22 && WaitTime < 24) {
          hour = 22;
        }

        const updateSql = `
          INSERT INTO WaitingTotal_Hour (resPhNum, ${hour}_)
          VALUES (?, 1)
          ON DUPLICATE KEY UPDATE ${hour}_ = COALESCE(${hour}_, 0) + 1;
        `;
        console.log(`Update SQL for resPhNum=${resPhNum}: \n ${updateSql}`); // 출력: update SQL for each row
        const updateParams = [resPhNum];
        connection.query(updateSql, updateParams, (err, result) => {
          if (err) {
            console.log(err);
          } else {
            console.log(`WaitingTotal_Hour 테이블의 ${resPhNum} 업데이트가 성공했습니다.`);
          }
        });
      });
    }
  });
}

// 매일 특정 시간에 WaitingTotal_Date 업데이트
cron.schedule('45 16 * * *', () => {
  updateWaitingTotalDate();
  console.log('매일 자정마다 작업 실행:', new Date().toString());
});

function updateWaitingTotalDate() {
  const sql = 'SELECT resPhNum, DAYOFWEEK(WaitTime) as DayOfWeek FROM Waiting';
  connection.query(sql, (err, rows, fields) => {
    if (err) {
      console.log(err);
    } else {
      rows.forEach((row) => {
        const resPhNum = row.resPhNum;
        const DayOfWeek = row.DayOfWeek;
        if (!resPhNum) { // resPhNum이 null인지 확인
          console.log('resPhNum이 null인 행을 건너뜁니다.');
          return;
        }
        let day;
        switch (DayOfWeek) {
          case 1: day = 'Sun'; break;
          case 2: day = 'Mon'; break;
          case 3: day = 'Tue'; break;
          case 4: day = 'Wed'; break;
          case 5: day = 'Thu'; break;
          case 6: day = 'Fri'; break;
          case 7: day = 'Sat'; break;
        }
        const updateSql = `
          INSERT INTO WaitingTotal_Date (resPhNum, ${day})
          VALUES (?, 1)
          ON DUPLICATE KEY UPDATE ${day} = COALESCE(${day}, 0) + 1;
        `;
        console.log(`Update SQL for resPhNum=${resPhNum}: \n ${updateSql}`); // 출력: update SQL for each row
        const updateParams = [resPhNum];
        connection.query(updateSql, updateParams, (err, result) => {
          if (err) {
            console.log(err);
          } else {
            console.log(`WaitingTotal_Date 테이블의 ${resPhNum} 업데이트가 성공했습니다.`);
          }
        });
      });
    }
  });
}```
profile
개발 여정기

0개의 댓글