복붙노트

[SQL] MySQL의에서 주말과 공휴일을 제외한 날짜 차이를 계산하는 방법

SQL

MySQL의에서 주말과 공휴일을 제외한 날짜 차이를 계산하는 방법

나는 주말 (가장 중요한)과 공휴일을 제외한 두 날짜 사이의 일 (영업일)을 계산해야

SELECT DATEDIFF(end_date, start_date) from accounts

그러나, 나는 MySQL은 그것을 어떻게해야하고 방법을 몰라, 나는 (단지 MySQL의) 주말을 제외하고 두 날짜 사이에이 문서의 개수 일 발견했다. 나는 MySQL은 기능적 쿼리에, 당신은 MySQL의 쿼리와이를 달성 할 수있는 방법에 대한 몇 가지 정보를 제공 할 수있는 방법을 알아낼 수 없습니다. 난 아무것도 놓친 경우 알려주세요.

[편집하다]

CREATE TABLE `candidatecase` (
  `ID` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Unique ID',
  `CreatedBy` int(11) NOT NULL,
  `UseraccountID` int(11) NOT NULL COMMENT 'User Account ID',
  `ReportReadyID` int(11) DEFAULT NULL COMMENT 'Report Ready ID',
  `DateCreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Date Created',
  `InitiatedDate` timestamp NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Date Initiated',
  `ActualCompletedDate` timestamp NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Date Completed Case',
  `ProjectedCompletedDate` timestamp NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Date Projected Finish',
  `CheckpackagesID` int(11) DEFAULT NULL COMMENT 'Default Check Package Auto Assign Once Initiate Start',
  `Alacartepackage1` int(11) DEFAULT NULL COMMENT 'Ala carte Request #2',
  `Alacartepackage2` int(11) DEFAULT NULL COMMENT 'Ala carte Request #3',
  `OperatorID` int(11) NOT NULL COMMENT 'User Account - Operator',
  `Status` int(11) NOT NULL COMMENT 'Status',
  `caseRef` varchar(100) NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=293 ;

--
-- Dumping data for table `candidatecase`
--

INSERT INTO `candidatecase` (`ID`, `CreatedBy`, `UseraccountID`, `ReportReadyID`, `DateCreated`, `InitiatedDate`, `ActualCompletedDate`, `ProjectedCompletedDate`, `CheckpackagesID`, `Alacartepackage1`, `Alacartepackage2`, `OperatorID`, `Status`, `caseRef`) VALUES
(1, 43, 70, NULL, '2011-07-22 02:29:31', '2011-07-07 07:27:44', '2011-07-22 02:29:31', '2011-07-17 06:53:52', 11, NULL, NULL, 44, 6, ''),
(2, 43, 74, NULL, '2012-04-03 04:17:15', '2011-07-11 07:07:23', '2011-07-13 05:32:58', '2011-07-21 07:01:34', 20, 0, 0, 51, 0, ''),
(3, 43, 75, NULL, '2011-07-29 04:10:07', '2011-07-11 07:27:12', '2011-07-29 04:10:07', '2011-07-21 07:02:14', 20, NULL, NULL, 45, 6, ''),
(4, 43, 78, NULL, '2011-07-18 03:32:27', '2011-07-11 07:51:31', '2011-07-13 02:18:34', '2011-07-21 07:37:53', 20, NULL, NULL, 45, 6, ''),
(5, 43, 76, NULL, '2011-07-29 04:09:19', '2011-07-11 07:51:11', '2011-07-29 04:09:19', '2011-07-21 07:38:30', 20, NULL, NULL, 45, 6, ''),
(6, 43, 77, NULL, '2011-07-18 03:32:49', '2011-07-11 07:51:34', '2011-07-18 02:18:46', '2011-07-21 07:39:00', 20, NULL, NULL, 45, 6, ''),
(7, 43, 79, NULL, '2011-07-18 03:33:02', '2011-07-11 07:53:24', '2011-07-18 01:50:12', '2011-07-21 07:42:57', 20, NULL, NULL, 45, 6, ''),
(8, 43, 80, NULL, '2011-07-29 04:10:38', '2011-07-11 07:53:58', '2011-07-29 04:10:38', '2011-07-21 07:43:14', 20, NULL, NULL, 45, 6, ''),
(9, 43, 81, NULL, '2011-07-18 03:31:54', '2011-07-11 07:53:49', '2011-07-13 02:17:02', '2011-07-21 07:43:43', 20, NULL, NULL, 45, 6, ''),
(11, 43, 88, NULL, '2011-07-18 03:15:53', '2011-07-13 04:57:38', '2011-07-15 08:57:15', '2011-07-23 04:39:14', 12, NULL, NULL, 44, 6, ''),
(13, 43, 90, NULL, '2011-07-26 07:39:24', '2011-07-13 12:16:48', '2011-07-26 07:39:24', '2011-07-23 12:13:50', 15, NULL, NULL, 51, 6, ''),
(63, 43, 176, NULL, '2011-09-13 08:23:13', '2011-08-26 10:00:32', '2011-09-13 08:23:13', '2011-09-05 09:58:47', 41, NULL, NULL, 45, 6, ''),
(62, 43, 174, NULL, '2011-08-24 03:54:30', '2011-08-24 03:53:13', '2011-08-24 03:54:30', '2011-08-29 03:52:48', 17, NULL, NULL, 51, 6, ''),
(61, 43, 173, NULL, '2011-08-24 03:55:05', '2011-08-24 03:53:39', '2011-08-24 03:55:05', '2011-08-29 03:52:36', 17, NULL, NULL, 51, 6, ''),
(60, 43, 172, NULL, '2011-08-24 03:22:41', '2011-08-24 03:21:50', '2011-08-24 03:22:41', '2011-08-29 03:21:11', 17, NULL, NULL, 51, 6, ''),
(59, 43, 171, NULL, '2011-08-24 03:23:19', '2011-08-24 03:22:00', '2011-08-24 03:23:19', '2011-08-29 03:20:57', 17, NULL, NULL, 51, 6, '');

해결법

  1. ==============================

    1.당신이 시도 할 수 있습니다 :

    당신이 시도 할 수 있습니다 :

    편집 : 종료일이 시작일보다 높은 경우이 만 제대로 작동하는지 유의하십시오.

  2. ==============================

    2.모든 다음 100whatever 년 동안 주말과 휴일을 포함하는 테이블을 만듭니다.

    모든 다음 100whatever 년 동안 주말과 휴일을 포함하는 테이블을 만듭니다.

    당신은 하루에 아무도 휴일이 2052이 될 것입니다하지만, 어쨌든이 시간에 정확한 기능을 할 수 없습니다 알고 없다는 것을 주어진 '휴일'인 경우 지정 할 수 있어야합니다. 다만 휴일 알려져 매년이 아닌 작업 일 테이블 업데이트 (하지만 당신은 항상 주말을 알게 될 것이다).

    그런 다음 쿼리가된다 :

    SELECT DATEFIFF(end_date, start_date) - COALESCE((SELECT COUNT(1) FROM nonWorkDays WHERE nonWorkDays.date BETWEEN start_date AND end_date), 0)
    FROM accounts
    

    당신이 정말 DATEDIFFWITHOUTWEEKENDSORHOLIDAYS를 작성해야하는 경우 기능 그럼 그냥 그냥 더 나은 이름을 지정해야합니다 .. (각 RDBMS의 기능을 만드는 방법에 많은 자원이있다) 위의를 사용하는 함수를 만들 수 있습니다. ^ _ ^

    당신은 수정해야 할 것은 오늘이 주말이 돌아 -1 대신 0을 반환하는 경우, 예를 들어, DATEDIFF (오늘, 오늘)에 대한 위의 하나없는 곳이 있다고 생각합니다.

  3. ==============================

    3.이런 식으로 뭔가가 작동하지 않을 수 있습니다. 테이블에 모든 휴가 기간과 주말 날짜를 추가합니다.

    이런 식으로 뭔가가 작동하지 않을 수 있습니다. 테이블에 모든 휴가 기간과 주말 날짜를 추가합니다.

    SELECT 
      DATEDIFF(end_date, start_date) 
    FROM table
    WHERE date NOT IN (SELECT date FROM holidaydatestable )
    
  4. ==============================

    4.주말을 제외하고 일의 어떤 규범이 계산됩니다 시도하지

    주말을 제외하고 일의 어떤 규범이 계산됩니다 시도하지

     SELECT
           (DATEDIFF(dd, @StartDate, @EndDate)+1)
          -(DATEDIFF(wk, @StartDate, @EndDate) * 2)
    from test_tbl where date NOT IN (SELECT date FROM holidaydatestable )
    
  5. ==============================

    5.그것은 토요일이나 일요일되지 때의 일 수를 증가 날짜 사이에 잠시 사이클을 만들 것입니다 기능을합니다.

    그것은 토요일이나 일요일되지 때의 일 수를 증가 날짜 사이에 잠시 사이클을 만들 것입니다 기능을합니다.

  6. from https://stackoverflow.com/questions/10330836/how-to-count-date-difference-excluding-weekend-and-holidays-in-mysql by cc-by-sa and MIT license