2012-10-17 3 views

답변

1

하나의 접근법은 일/날짜의 구체화 된 테이블을 갖는 것입니다. 그러나이 구체화 된 테이블을 작성하는 데 사용되는 동일한 방법을 쿼리에 직접 사용할 수 있습니다. 나는 [평일] 계산의 몇 가지를 보여,하지만 당신은 (주말 값이 6 (5), 그리고) 주말에 대한 쿼리 같은 방법을 사용할 수 있습니다

직접 단일 쿼리의 예 :

SELECT day 
    , WEEKDAY(day) AS wkday 
    FROM (
SELECT FROM_DAYS(d.day1+v1.result) AS day 
    FROM (SELECT TO_DAYS(DATE('2000-01-01')) AS day1 
      , TO_DAYS(DATE('2021-01-01')) AS day2 
    ) AS d 
    JOIN (
     SELECT v1.num+v2.num+v3.num+v4.num AS result 
     FROM (
       SELECT 1 AS num UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 
      UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0 
      ) AS v1 
     JOIN (
       SELECT 10 AS num UNION SELECT 20 UNION SELECT 30 UNION SELECT 40 UNION SELECT 50 
      UNION SELECT 60 UNION SELECT 70 UNION SELECT 80 UNION SELECT 90 UNION SELECT 00 
      ) AS v2 
     JOIN (
       SELECT 100 AS num UNION SELECT 200 UNION SELECT 300 UNION SELECT 400 UNION SELECT 500 
      UNION SELECT 600 UNION SELECT 700 UNION SELECT 800 UNION SELECT 900 UNION SELECT 000 
      ) AS v3 
     JOIN (
       SELECT 1000 AS num UNION SELECT 2000 UNION SELECT 3000 UNION SELECT 4000 UNION SELECT 5000 
      UNION SELECT 6000 UNION SELECT 7000 UNION SELECT 8000 UNION SELECT 9000 UNION SELECT 0000 
      ) AS v4 
    ) v1 
WHERE v1.result < (d.day2-d.day1) 
    ) AS days 
WHERE WEEKDAY(day) < 5 
LIMIT 10 
; 



USE test; 

DROP TABLE IF EXISTS days; 

CREATE TABLE days (
    day date PRIMARY KEY 
) ENGINE = InnoDB; 

INSERT INTO days 
SELECT FROM_DAYS(d.day1+v1.result) 
    FROM (SELECT TO_DAYS(DATE('2000-01-01')) AS day1 
      , TO_DAYS(DATE('2021-01-01')) AS day2 
    ) AS d 
    JOIN (
     SELECT v1.num+v2.num+v3.num+v4.num AS result 
     FROM (
       SELECT 1 AS num UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 
      UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0 
      ) AS v1 
     JOIN (
       SELECT 10 AS num UNION SELECT 20 UNION SELECT 30 UNION SELECT 40 UNION SELECT 50 
      UNION SELECT 60 UNION SELECT 70 UNION SELECT 80 UNION SELECT 90 UNION SELECT 00 
      ) AS v2 
     JOIN (
       SELECT 100 AS num UNION SELECT 200 UNION SELECT 300 UNION SELECT 400 UNION SELECT 500 
      UNION SELECT 600 UNION SELECT 700 UNION SELECT 800 UNION SELECT 900 UNION SELECT 000 
      ) AS v3 
     JOIN (
       SELECT 1000 AS num UNION SELECT 2000 UNION SELECT 3000 UNION SELECT 4000 UNION SELECT 5000 
      UNION SELECT 6000 UNION SELECT 7000 UNION SELECT 8000 UNION SELECT 9000 UNION SELECT 0000 
      ) AS v4 
    ) v1 
WHERE v1.result < (d.day2-d.day1) 
; 

SELECT * 
    FROM days 
ORDER BY day 
LIMIT 10 
; 


SELECT COUNT(*) FROM days; 

SELECT MIN(day), MAX(day) FROM days; 

SELECT day, WEEKDAY(day) FROM days LIMIT 6; 

SELECT day, WEEKDAY(day) AS wkday FROM days WHERE WEEKDAY(day) < 5 LIMIT 6; 

SELECT COUNT(*), MIN(day), MAX(day) FROM days WHERE WEEKDAY(day) < 5; 
+0

이 작업 예제를 참조하십시오 : http://sqlfiddle.com/#!2/aa146/2 –

+0

2 개의 날짜가 주어진 쿼리에서이 작업을 완전히 수행 할 수 있습니까? 나는 이것에 대한 표를 만드는 것이 조금은 편하다고 생각합니다. 나는 2 개의 날짜의 날에 차이를 얻을 것 인 datediff가있다라는 것을 알고있다, 나는 주간 마이너스 주말 또는 무엇인가 말하는 길이 있는지 나는 정말로 wasnt한다. – Fallenreaper

+0

물론입니다. 하나의 쿼리에서 여러 가지 방법으로이를 수행 할 수 있습니다. 기본 테이블을 만드는 대신 위의 테이블을 파생 테이블이나 뷰에서 직접 사용할 수 있습니다. 그런 다음 쿼리 내에서 파생 테이블이나 뷰를 사용할 수 있습니다. 매우 간단합니다. –

1

이를 간단한 쿼리는 MySQL과이 개 기간 내 평일의 수를 찾을 수있다 :

set @d1='2013-09-25'; 
set @d2='2013-10-13'; 

select floor(datediff(@d2, @d1)/7)*5 + 
(case when if(weekday(@d2)>=5,4,weekday(@d2))>=if(weekday(@d1)>=5,4,weekday(@d1)) 
then if(weekday(@d2)>=5,4,weekday(@d2))-if(weekday(@d1)>=5,4,weekday(@d1)) 
else 5+if(weekday(@d2)>=5,4,weekday(@d2))-if(weekday(@d1)>=5,4,weekday(@d1)) end) weekdays; 

PHP로 작성된 동일한 알고리즘 :

function getWeekDays($d1,$d2){ 
$d1Array=preg_split('/-/',$d1); 
$d2Array=preg_split('/-/',$d2); 
$d1w=date('w',mktime(0,0,0,$d1Array[1],$d1Array[2],$d1Array[0])); 
$d1w=in_array($d1w,array(0,6))?4:$d1w-1; 
$d2w=date('w',mktime(0,0,0,$d2Array[1],$d2Array[2],$d2Array[0])); 
$d2w=in_array($d2w,array(0,6))?4:$d2w-1; 

$fullWeekDays=floor(((mktime(0,0,0,$d2Array[1],$d2Array[2],$d2Array[0])-mktime(0,0,0,$d1Array[1],$d1Array[2],$d1Array[0]))/86400)/7)*5; 
$offset=$d2w>=$d1w?($d2w-$d1w):(5+$d2w-$d1w); 
$weekDays=$fullWeekDays+$offset; 

return $weekDays; 
} 
관련 문제