복붙노트

[SQL] 주말을 제외한 SQL에서 두 날짜 사이의 계산 차이,

SQL

주말을 제외한 SQL에서 두 날짜 사이의 계산 차이,

나는 결과에 주말 일 계산하지 않고, 두 날짜 사이의 차이를 계산하는 SQL 쿼리를 구축하고 싶습니다.

이 결과를 얻기 위해 날짜를 포맷하는 방법은 없나요? 오라클 데이터베이스에 대한 예를 들어 :

select sysdate - creation_dttm from the_table

해결법

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

    1.당신은 기능을 시도해야합니다 :

    당신은 기능을 시도해야합니다 :

    CREATE FUNCTION TOTAL_WEEKDAYS(date1 DATE, date2 DATE)
    RETURNS INT
    RETURN ABS(DATEDIFF(date2, date1)) + 1
         - ABS(DATEDIFF(ADDDATE(date2, INTERVAL 1 - DAYOFWEEK(date2) DAY),
                        ADDDATE(date1, INTERVAL 1 - DAYOFWEEK(date1) DAY))) / 7 * 2
         - (DAYOFWEEK(IF(date1 < date2, date1, date2)) = 1)
         - (DAYOFWEEK(IF(date1 > date2, date1, date2)) = 7);
    

    테스트 :

    SELECT TOTAL_WEEKDAYS('2013-08-03', '2013-08-21') weekdays1,
           TOTAL_WEEKDAYS('2013-08-21', '2013-08-03') weekdays2;
    

    결과 :

    | WEEKDAYS1 | WEEKDAYS2 |
    -------------------------
    |        13 |        13 |
    
  2. ==============================

    2.나는 그들이 주장 일을하지 않는이 스레드에 대한 답변의 몇 가지를 발견했다. 일부 실험, 테스트 및 조정 한 후,이 기여해야합니다.

    나는 그들이 주장 일을하지 않는이 스레드에 대한 답변의 몇 가지를 발견했다. 일부 실험, 테스트 및 조정 한 후,이 기여해야합니다.

    declare @firstdate Date
    declare @seconddate Date
    
    set @firstDate = convert(date, '2016-03-07')
    set @seconddate = convert(date, '2016-04-04')
    
    
    select (datediff(dd, @firstDate, @secondDate)) - 
        (( DateDiff(wk, @firstDate, @secondDate) * 2) - 
          case when datepart(dw, @FirstDate) = 7 then 1 else 0 end -
          case when datepart(dw, @secondDate) = 7 then -1 else 0 end)
    

    테스트 하네스 포함 - 당신은 단지 두 날짜를 조정하고 자신의 테스트를 실행할 수 있습니다. 이것은 당신의 나라가 주말을 나타 내기 위해 다른 날 사용하는 경우 두 개의 인접한 평일 날짜 사이의 차이는 1이다, 당신은 당신의 "토요일"7, 그리고 '일요일이 "1 그래서 따라 날짜베이스를 설정해야합니다 가정합니다.

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

    3.이전 포스트에서 :

    이전 포스트에서 :

    DECLARE @StartDate DATETIME
    DECLARE @EndDate DATETIME
    SET @StartDate = '2008/10/01'
    SET @EndDate = '2008/10/31'
    
    
    SELECT
       (DATEDIFF(dd, @StartDate, @EndDate) + 1)
      -(DATEDIFF(wk, @StartDate, @EndDate) * 2)
      -(CASE WHEN DATENAME(dw, @StartDate) = 'Sunday' THEN 1 ELSE 0 END)
      -(CASE WHEN DATENAME(dw, @EndDate) = 'Saturday' THEN 1 ELSE 0 END)
    
  4. ==============================

    4.난 단지 SQL을 사용하여 차이를 계산 할 수있는 다른 방법을 발견했다 :

    난 단지 SQL을 사용하여 차이를 계산 할 수있는 다른 방법을 발견했다 :

    select sysdate - creation_dttm
    - 2 * (to_char(sysdate, 'WW') - to_char(creation_dttm, 'WW'))
    from the_table
  5. ==============================

    5.다음은 그 예이다 : 네 개의 변수는, 처음 두 화면이 설명 단지 YYYYMMDD 형식으로 날짜를 입력 할 수 있습니다 있습니다, 3 일이 사이트는 일주일에 육일 작동 그렇다면, 특정 주에 정상 작업 일 수를 설정하는 것입니다, 그것을 설정 6 5 일에 일주일에 입력 5 등 마지막으로, 오라클에 대해 실행할 때 DATE_SEQ_NORML_FACTOR는 1이어야한다. 이것은 아마 0에서 6 사이의 서로 다른 값을 갖게됩니다 MOD 7. 기타 DB를 적용 할 때 등 월요일, 화요일에 2, 1로 동일하게 율리우스 날짜를 줄 다른 데시벨에 사용하기 전에 그래서 그것을 테스트하는 것입니다.

    다음은 그 예이다 : 네 개의 변수는, 처음 두 화면이 설명 단지 YYYYMMDD 형식으로 날짜를 입력 할 수 있습니다 있습니다, 3 일이 사이트는 일주일에 육일 작동 그렇다면, 특정 주에 정상 작업 일 수를 설정하는 것입니다, 그것을 설정 6 5 일에 일주일에 입력 5 등 마지막으로, 오라클에 대해 실행할 때 DATE_SEQ_NORML_FACTOR는 1이어야한다. 이것은 아마 0에서 6 사이의 서로 다른 값을 갖게됩니다 MOD 7. 기타 DB를 적용 할 때 등 월요일, 화요일에 2, 1로 동일하게 율리우스 날짜를 줄 다른 데시벨에 사용하기 전에 그래서 그것을 테스트하는 것입니다.

    여기에 제한은 다음과 같습니다 : 1.이 공식은 가정 일주일의 첫 날은 월요일이다. 2.이 공식은 같은 주 내의 모든 일 연속 가정합니다. 3. 계산에 포함 된 두 날짜가 예를 들어 일주일에 하루 또는 작업 일에 떨어질 때이 공식에만 작동합니다. 토요일에 "시작 날짜"위치는 MON-FRI하지 않습니다 작업을 작동 할 때.

    SELECT
    
      &&START_DATE_YYYYMMDD "Start Date", --in YYYYMMDD format
    
      &&END_DATE_YYYYMMDD "End Date", --in YYYYMMDD format
    
      &&WK_WORK_DAY_CNT "Week Work Day Count", --Number of work day per week
    
      &&DATE_SEQ_NORML_FACTOR "Normalization Factor", --set to 1 when run in Oracle
    
      CASE
    
      WHEN
    
        FLOOR( TO_CHAR( TO_DATE( &&START_DATE_YYYYMMDD , 'YYYYMMDD') , 'J' ) + &&DATE_SEQ_NORML_FACTOR / 7 ) =
    
        FLOOR( TO_CHAR( TO_DATE( &&END_DATE_YYYYMMDD , 'YYYYMMDD') , 'J' ) + &&DATE_SEQ_NORML_FACTOR / 7 )
    
      THEN(
    
        TO_CHAR( TO_DATE( &&END_DATE_YYYYMMDD , 'YYYYMMDD') , 'J' ) -
    
        TO_CHAR( TO_DATE( &&START_DATE_YYYYMMDD , 'YYYYMMDD') , 'J' ) + 1
    
      )
    
      ELSE(
    
        (
    
          &&WK_WORK_DAY_CNT - MOD( TO_CHAR( TO_DATE( &&START_DATE_YYYYMMDD , 'YYYYMMDD') , 'J' ) + &&DATE_SEQ_NORML_FACTOR , 7 ) + 1
    
        ) +
    
        MOD( TO_CHAR( TO_DATE( &&END_DATE_YYYYMMDD , 'YYYYMMDD') , 'J' ) + &&DATE_SEQ_NORML_FACTOR , 7 ) +
    
        (
    
          (
    
            (
    
              TO_CHAR( TO_DATE( &&END_DATE_YYYYMMDD , 'YYYYMMDD') , 'J' ) -
    
              MOD( TO_CHAR( TO_DATE( &&END_DATE_YYYYMMDD , 'YYYYMMDD') , 'J' ) + &&DATE_SEQ_NORML_FACTOR , 7 )
    
            ) -
    
            (
    
              TO_CHAR( TO_DATE( &&START_DATE_YYYYMMDD , 'YYYYMMDD') , 'J' ) +
    
              (
    
                7 -
    
                (
    
                  MOD( TO_CHAR( TO_DATE( &&START_DATE_YYYYMMDD , 'YYYYMMDD') , 'J' ) + &&DATE_SEQ_NORML_FACTOR , 7 )
    
                )
    
              )
    
            )
    
          ) / 7 * &&WK_WORK_DAY_CNT
    
        )
    
      ) END "Week Day Count"
    
    FROM DUAL
    
  6. ==============================

    6.우리는 큰 성공을 여러 보고서에 다음과 같은 논리를 통합했습니다. 죄송합니다, 나는 더 이상 신용을 제공하는이 스크립트의 소스를 기억하지 않습니다.

    우리는 큰 성공을 여러 보고서에 다음과 같은 논리를 통합했습니다. 죄송합니다, 나는 더 이상 신용을 제공하는이 스크립트의 소스를 기억하지 않습니다.

    DECLARE @range INT;
    
    SET @range = DATEDIFF(DAY, @FirstDate, @SecondDate); 
    SET @NumWorkDays = (
        SELECT  
        @range / 7 * 5 + @range % 7 - ( 
            SELECT COUNT(*)  
            FROM ( 
                SELECT 1 AS d 
                UNION ALL SELECT 2  
                UNION ALL SELECT 3  
                UNION ALL SELECT 4  
                UNION ALL SELECT 5  
                UNION ALL SELECT 6  
                UNION ALL SELECT 7 
                ) weekdays 
            WHERE d <= @range % 7  
            AND DATENAME(WEEKDAY, @SecondDate - d) IN ('Saturday', 'Sunday'))
        );
    
  7. ==============================

    7.나는 다른 지역은 항상 토요일과 일요일의 주말을하지 않아도 고려해야 할 JOpuckman의 기능 @ 업데이트되었습니다. 다음은이 전 세계적으로 적용 할 경우 다른 사람의 요구에 코드가있다;

    나는 다른 지역은 항상 토요일과 일요일의 주말을하지 않아도 고려해야 할 JOpuckman의 기능 @ 업데이트되었습니다. 다음은이 전 세계적으로 적용 할 경우 다른 사람의 요구에 코드가있다;

    DECLARE @FirstDate DateTime
    DECLARE @SecondDate DateTime
    
    SET @FirstDate = '08-20-2012'
    SET @SecondDate = '08-24-2012'
    
    DECLARE @range INT;
    DECLARE @WeekendDayNameStart VARCHAR(50) 
    DECLARE @WeekendDayNameEnd VARCHAR(50)
    
    SET @WeekendDayNameStart = 'FRIDAY'
    SET @WeekendDayNameEnd = (
        SELECT CASE @WeekendDayNameStart
            WHEN 'SUNDAY' THEN 'MONDAY'
            WHEN 'MONDAY' THEN 'TUESDAY'
            WHEN 'TUESDAY' THEN 'WEDNESDAY'
            WHEN 'WEDNESDAY' THEN 'THURSDAY'
            WHEN 'THURSDAY' THEN 'FRIDAY'
            WHEN 'FRIDAY' THEN 'SATURDAY'
            WHEN 'SATURDAY' THEN 'SUNDAY'
        END
    )
    
    DECLARE @NumWorkDays INT
    
    SET @range = DATEDIFF(DAY, @FirstDate, @SecondDate); 
    SET @NumWorkDays = (
    SELECT  
    @range / 7 * 5 + @range % 7 - ( 
        SELECT COUNT(*)  
        FROM ( 
            SELECT 1 AS d 
            UNION ALL SELECT 2  
            UNION ALL SELECT 3  
            UNION ALL SELECT 4  
            UNION ALL SELECT 5  
            UNION ALL SELECT 6  
            UNION ALL SELECT 7 
            ) weekdays 
        WHERE d <= @range % 7  
        AND DATENAME(WEEKDAY, @SecondDate - d) IN (@WeekendDayNameStart, @WeekendDayNameEnd))
    );
    
    -- Calculate whether the current date is a working day
    DECLARE @CurDateExtra INT
    SET @CurDateExtra = 
    (
        CASE DATENAME(WEEKDAY, @SecondDate)
        WHEN @WeekendDayNameStart THEN 0
        WHEN @WeekendDayNameEnd THEN 0
        ELSE 1
        END
    )
    
    SET @NumWorkDays = @NumWorkDays + @CurDateExtra
    SELECT @NumWorkDays
    
  8. ==============================

    8.내가 생각 @lightmania 응답에 문제가 있습니다.

    내가 생각 @lightmania 응답에 문제가 있습니다.

    값을 사용 :

    select (TO_DATE('06/02/2014', 'DD/MM/YYYY') - 
            TO_DATE('04/02/2014', 'DD/MM/YYYY') - 
            2 * (to_char(TO_DATE('06/02/2014', 'DD/MM/YYYY'), 'WW') -
                 to_char(TO_DATE('04/02/2014', 'DD/MM/YYYY'), 'WW'))) from dual;
    

    대신 0이 반환해야한다는이 돌아왔다.

  9. ==============================

    9.((SYSDATE - ced.created_dt) + ((((TO_CHAR (ced.created_dt 'IW') - ((TO_CHAR (SYSDATE, 'YY') - TO_CHAR (ced.created_dt, 'YY')) * 52)) - TO_CHAR (TO_CHAR (SYSDATE 'IW')))) * 2)) duration_in_weekdays

    ((SYSDATE - ced.created_dt) + ((((TO_CHAR (ced.created_dt 'IW') - ((TO_CHAR (SYSDATE, 'YY') - TO_CHAR (ced.created_dt, 'YY')) * 52)) - TO_CHAR (TO_CHAR (SYSDATE 'IW')))) * 2)) duration_in_weekdays

  10. ==============================

    10.이 시도 할 수 있습니다 :

    이 시도 할 수 있습니다 :

    SELECT
        Id,
        DATEDIFF(d, datefrom, dateto) AS TotDays,
        DATEDIFF(wk, datefrom, dateto) AS Wkds,
        DATEDIFF(d, datefrom, dateto) - DATEDIFF(wk, datefrom, dateto) AS Days
    FROM
        YOURTABLE
    
  11. from https://stackoverflow.com/questions/8331951/calculate-difference-between-2-dates-in-sql-excluding-weekend-days by cc-by-sa and MIT license