[SQL] 주말을 제외한 SQL에서 두 날짜 사이의 계산 차이,
SQL주말을 제외한 SQL에서 두 날짜 사이의 계산 차이,
나는 결과에 주말 일 계산하지 않고, 두 날짜 사이의 차이를 계산하는 SQL 쿼리를 구축하고 싶습니다.
이 결과를 얻기 위해 날짜를 포맷하는 방법은 없나요? 오라클 데이터베이스에 대한 예를 들어 :
select sysdate - creation_dttm from the_table
해결법
-
==============================
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.나는 그들이 주장 일을하지 않는이 스레드에 대한 답변의 몇 가지를 발견했다. 일부 실험, 테스트 및 조정 한 후,이 기여해야합니다.
나는 그들이 주장 일을하지 않는이 스레드에 대한 답변의 몇 가지를 발견했다. 일부 실험, 테스트 및 조정 한 후,이 기여해야합니다.
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.이전 포스트에서 :
이전 포스트에서 :
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.난 단지 SQL을 사용하여 차이를 계산 할 수있는 다른 방법을 발견했다 :
난 단지 SQL을 사용하여 차이를 계산 할 수있는 다른 방법을 발견했다 :
select sysdate - creation_dttm - 2 * (to_char(sysdate, 'WW') - to_char(creation_dttm, 'WW')) from the_table
-
==============================
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.우리는 큰 성공을 여러 보고서에 다음과 같은 논리를 통합했습니다. 죄송합니다, 나는 더 이상 신용을 제공하는이 스크립트의 소스를 기억하지 않습니다.
우리는 큰 성공을 여러 보고서에 다음과 같은 논리를 통합했습니다. 죄송합니다, 나는 더 이상 신용을 제공하는이 스크립트의 소스를 기억하지 않습니다.
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.나는 다른 지역은 항상 토요일과 일요일의 주말을하지 않아도 고려해야 할 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.내가 생각 @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.((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.이 시도 할 수 있습니다 :
이 시도 할 수 있습니다 :
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
from https://stackoverflow.com/questions/8331951/calculate-difference-between-2-dates-in-sql-excluding-weekend-days by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 열을 지정하지 않고 SQL INSERT. 무슨 일이야? (0) | 2020.06.18 |
---|---|
[SQL] 시퀀스에서 다음 번호를 얻는 방법 (0) | 2020.06.18 |
[SQL] 어떻게 2008 SQL 서버에서 XML 열을 읽습니까? (0) | 2020.06.18 |
[SQL] 함수 (SQL 서버) 내에서 동적 SQL을 실행할 때 오류를 얻기? (0) | 2020.06.18 |
[SQL] 이 표에서 간단한 SQL 선택 (A 무엇을 가입한다?) (0) | 2020.06.18 |