휴일과 주말을 제외한 두 날짜 사이의 날짜를 어떻게 계산합니까?
저는 인사관리 프로젝트를 시작했고 휴일과 주말을 제외하고 두 날짜 사이의 날짜를 세고 싶습니다.그래서 인사부에서 직원들의 쉬는 날을 계산할 수 있습니다.
이런 경우가 있습니다, 저는 그 사이에서 계산하고 싶습니다.2018-02-14
그리고.2018-02-20
회사의 휴일이 있는 곳.2018-02-16
결과는 3일이 되어야 합니다.
다음 테이블을 이미 만들었습니다.tbl_holiday
내가 그곳에서 1년에 모든 주말과 휴일을 보내는 곳.
제 질문은 이렇습니다.
SELECT 5 * (DATEDIFF('2018-02-20', '2018-02-14') DIV 7) +
MID('0123444401233334012222340111123400012345001234550', 7 *
WEEKDAY('2018-02-14') + WEEKDAY('2018-02-20') + 1, 1) -
(SELECT COUNT(dates) FROM tbl_holiday WHERE dates NOT IN (SELECT dates FROM tbl_holiday)) as Days
쿼리는 작동하지만 결과는 3일이 아니라 4일입니다.이는 쿼리에서 주말만 제외하고 휴일은 제외하지 않음을 의미합니다.
내 질문에 무슨 문제가 있습니까?내가 뭘 빼놓았나요?도와주셔서 감사합니다.
@리처드 도, 질문 댓글에서.
날짜 표를 합리적으로 구현할 때는 모든 날짜 목록을 만들고(실행할 수 있는 쿼리를 처리할 수 있는 충분한 범위 포함 - 오늘부터 15년이 유용한 최소 기간일 수 있음), 매일 다양한 파생 속성을 저장합니다.
SQL Server를 시작하는 데 도움이 되는 기본 툴을 사용하여 최근 Q&A를 작성했습니다. https://stackoverflow.com/a/48611348/9129668
유감스럽게도 저는 MySQL 환경을 잘 모르거나 제가 하고 있는 것처럼 즉석에서 쿼리를 작성하거나 조정할 수 있는 친숙한 환경이 아닙니다. 하지만 이를 통해 SQL Server 구문에 대한 솔루션의 구조를 설명할 수 있기를 바랍니다.
제가 링크하는 답변(즉각 날짜 테이블을 생성함)과 휴일 테이블에 추가(그리고 휴일 테이블을 정의한 방법에 대해 약간의 추론을 함), 그리고 근무일이 휴일이 아닌 모든 요일이라는 점에 주목함으로써,다음과 같은 쿼리를 작성하여 두 날짜 사이의 근무일 수를 얻습니다.
WITH
dynamic_date_table AS
(
SELECT *
FROM generate_series_datetime2('2000-01-01','2030-12-31',1)
CROSS APPLY datetime2_params_fxn(datetime2_value)
)
,date_table_ext1 AS
(
SELECT
ddt.*
,IIF(hol.dates IS NOT NULL, 1, 0) AS is_company_holiday
FROM
dynamic_date_table AS ddt
LEFT JOIN
tbl_holiday AS hol
ON (hol.dates = ddt.datetime2_value)
)
,date_table_ext2 AS
(
SELECT
*
,IIF(is_weekend = 1 OR is_company_holiday = 1, 0, 1) AS is_company_work_day
FROM date_table_ext1
)
SELECT
COUNT(datetime2_value)
FROM
date_table_ext2
WHERE
(datetime2_value BETWEEN '2018-02-14' AND '2018-02-20')
AND
(is_company_work_day = 1)
분명히, 이러한 중간 계산(전체 회사에 대한 일반적인 특성)이 다음과 같은 환경에 적용된다는 것이 잘 고려된 솔루션에 대한 아이디어입니다.date_params_fxn
데이터베이스에 대해 실행되는 쿼리가 사전 정의된 회사 근무일 목록에 액세스할 수 있도록 합니다.이에 대해 실행된 질문은 단순한 영어와 유사해지기 시작합니다(당신의 질문에 연결하고 적용한 접근 방식이 아니라, 독창적이지만 명확하지 않습니다).
최고의 성능(이러한 계산을 많이 수행하는 경우 관련성이 있음)을 원하는 경우 적절한 매개변수를 정의하고 로트를 저장된 날짜 테이블에 저장한 다음 해당 테이블을 적절하게 인덱싱합니다.이렇게 하면 쿼리가 여기 쿼리의 마지막 부분처럼 간단해지지만 블록이 있는 대신 저장된 날짜 테이블을 참조합니다.
당신의 질문에 대한 제 의견에서 제가 언급한 순차 번호 근무일은 날짜 테이블에 대한 특정 유형의 쿼리의 효율성과 색인성을 위한 또 다른 단계이지만, 지금은 이 답변을 더 복잡하게 만들지는 않겠습니다.만약 더 명확한 설명이 필요하다면, 언제든지 물어보세요.
나는 이 문제에 대한 답을 찾았습니다.
알고 보니, 이 문제에 간단한 산술 연산자를 사용하면 됩니다.
SELECT (SELECT DATEDIFF('2018-02-20', '2018-02-14')) - (SELECT COUNT(id) FROM tbl_holiday WHERE dates BETWEEN '2018-02-14' AND '2018-02-20');
언급URL : https://stackoverflow.com/questions/48682162/how-to-count-days-between-2-dates-except-holiday-and-weekend
'programing' 카테고리의 다른 글
MariaDB/MySQL tmp 테이블이 전체 디스크 공간을 사용하고 있습니다. (0) | 2023.09.03 |
---|---|
jAJAX로 Google 시각화 API 로드 (0) | 2023.09.03 |
CORS(심포니, jQuery, FOSRest 번들 및 Nelmio Cors 번들 포함) (0) | 2023.09.03 |
CSS를 사용하여 배경 이미지 중심 맞추기 (0) | 2023.09.03 |
파워셸의 스레드는 어떻게 작동합니까? (0) | 2023.09.03 |