programing

휴일과 주말을 제외한 두 날짜 사이의 날짜를 어떻게 계산합니까?

muds 2023. 9. 3. 16:40
반응형

휴일과 주말을 제외한 두 날짜 사이의 날짜를 어떻게 계산합니까?

저는 인사관리 프로젝트를 시작했고 휴일과 주말을 제외하고 두 날짜 사이의 날짜를 세고 싶습니다.그래서 인사부에서 직원들의 쉬는 날을 계산할 수 있습니다.

이런 경우가 있습니다, 저는 그 사이에서 계산하고 싶습니다.2018-02-14그리고.2018-02-20회사의 휴일이 있는 곳.2018-02-16결과는 3일이 되어야 합니다.

다음 테이블을 이미 만들었습니다.tbl_holiday내가 그곳에서 1년에 모든 주말과 휴일을 보내는 곳.

게시물을 찾아서 마리아에게 써봤어요DB

제 질문은 이렇습니다.

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

반응형