[SQL] MySQL의에서 주말과 공휴일을 제외한 날짜 차이를 계산하는 방법
SQLMySQL의에서 주말과 공휴일을 제외한 날짜 차이를 계산하는 방법
나는 주말 (가장 중요한)과 공휴일을 제외한 두 날짜 사이의 일 (영업일)을 계산해야
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.당신이 시도 할 수 있습니다 :
당신이 시도 할 수 있습니다 :
편집 : 종료일이 시작일보다 높은 경우이 만 제대로 작동하는지 유의하십시오.
-
==============================
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.이런 식으로 뭔가가 작동하지 않을 수 있습니다. 테이블에 모든 휴가 기간과 주말 날짜를 추가합니다.
이런 식으로 뭔가가 작동하지 않을 수 있습니다. 테이블에 모든 휴가 기간과 주말 날짜를 추가합니다.
SELECT DATEDIFF(end_date, start_date) FROM table WHERE date NOT IN (SELECT date FROM holidaydatestable )
-
==============================
4.주말을 제외하고 일의 어떤 규범이 계산됩니다 시도하지
주말을 제외하고 일의 어떤 규범이 계산됩니다 시도하지
SELECT (DATEDIFF(dd, @StartDate, @EndDate)+1) -(DATEDIFF(wk, @StartDate, @EndDate) * 2) from test_tbl where date NOT IN (SELECT date FROM holidaydatestable )
-
==============================
5.그것은 토요일이나 일요일되지 때의 일 수를 증가 날짜 사이에 잠시 사이클을 만들 것입니다 기능을합니다.
그것은 토요일이나 일요일되지 때의 일 수를 증가 날짜 사이에 잠시 사이클을 만들 것입니다 기능을합니다.
from https://stackoverflow.com/questions/10330836/how-to-count-date-difference-excluding-weekend-and-holidays-in-mysql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL을 사용하여 여러 분야에서 서로 다른 선택 (0) | 2020.05.24 |
---|---|
[SQL] MySQL은 - 어떻게 다음 행에서 이전 행과 가치의 가치를 얻을? [복제] (0) | 2020.05.24 |
[SQL] 오라클 : ORDER BY 절과 함께 ROWNUM을 사용하여 테이블 열을 업데이트 (0) | 2020.05.24 |
[SQL] 어떻게 3360에 3306에서 MySQL의 기본 포트를 변경하려면 (0) | 2020.05.24 |
[SQL] C #에서 호출 SQL 정의 기능 (0) | 2020.05.24 |