2009-11-29 4 views
1

ISO 날짜 배열이있는 경우 배열에서 두 개의 순차 날짜 사이의 요일을 어떻게 계산합니까?연속 된 두 날짜 사이의 최대 일수 계산

$array = array('2009-03-11', '2009-03-12', '2009-04-12', '2009-05-03', '2009-10-30');

는 내가 루프, 변수 및 정렬을 반복 일종의 필요가 있다고 생각합니다. 나는 그것을 이해할 수 없다.

이것은 실제로 MYSQL에서 출력됩니다.

+0

그 결과는 무엇입니까? –

+0

나는 이해하지 못한다. 대답을 찾았습니까? 그렇다면 아래의 코드에서 코드를 제공하고 해결 방법을 표시하거나 매우 가까운 경우 올바른 대답으로 표시하십시오. –

답변

1

당신이 PHP에서 그것을 할 수있는 방법은 다음과 같습니다 :

<?php 
$array = array('2009-03-11', '2009-03-12', '2009-04-12', '2009-05-03', '2009-10-30'); 

# PHP was throwing errors until I set this 
# it may be unnecessary depending on where you 
# are using your code: 
date_default_timezone_set("GMT"); 

$max = 0; 
if(count($array) > 1){ 
    for($i = 0; $i < count($array) - 1; $i++){ 
     $start = strtotime($array[$i]); 
     $end = strtotime($array[$i + 1]); 

     $diff = $end - $start; 
     if($diff > $max) $max = $diff; 
    } 
} 

$max = $max/(60*60*24); 

?> 

그것은 루프 던져 당신 차이점은 다음과 같은 것, 일의 최대 수 ... PHP에서
을 제공합니다 r 항목 (항목 수가있는 것보다 적은 시간을 실행 함)을 선택하고 각각을 비교합니다. 비교가 다음보다 클 경우 최대 값을 업데이트합니다. 시간은 초 단위이므로 루프가 끝나면 초를 일로 변환합니다.$ i가 maxinterval $) $ maxinterval = $ 일;

+0

나는이 접근법이 몇 가지 이유로 인해 효과가 없을까 걱정된다. 1) 배열의 첫 번째 데이터와 예를 들어 세 번째 데이터가 평가되지 않는다는 등의 가능한 모든 차이의 하위 집합 만 테스트합니다. 2) 두 날짜가 오름차순으로 간주된다고 가정합니다. 간단한 테스트는 # 2를 고칠 수 있습니다. # 1은 내부 루프를 도입해야합니다. (이 방법은 btw가 최소 날짜와 최대 날짜를 찾는 것보다 덜 효율적입니다.) – mjv

+0

질문은 "순차적 날짜 사이의 가장 큰 간격"이므로 날짜 1과 3 사이의 거리는 관련성이 없습니다. 질문은 ASC 순서로 날짜를 나열한 이후로 나는 그들이 MySQL로부터 올바른 순서로 있다고 가정했다. –

+0

@dcneiner 당신의 관점을 이해합니다. 그 질문에 대한 이해와 함께, 당신의 대답은 물론 정확합니다. '순차적'이라는 용어를 사용하는 것보다는 '정렬'이 필요할 수 있다는 힌트를 얻었 기 때문에 해결책이되었습니다. +1 (당신이 질문의보기에서) 정답에 대한, 나는 두 가지 가능한 답변 hilight 내 편집합니다. 우리는 어쨌든 가난하게 말로 표현 된 질문과 일반적으로 동의하지 않는 (또는 심지어 대답하는) OP를 위해 너무 열심히 노력하고 있습니다 ;-) – mjv

1

EDIT :
바와 같이 [원래 상기 질문에 대한 이해 될 수 말로 [적어도 ;-) 2 개 개의 방법 :

  • A)의 배열이 오름차순 날짜 목록을 포함한다. 작업은 배열에서 연속 날짜 사이의 가장 긴 기간 (일 수로 표시)을 찾는 것입니다.
  • B) 배열을 반드시 정렬 할 필요는 없습니다. 이 작업은 (일수에. EXPR)을 longuest 기간을 찾을 수 있습니다 다음은 질문의 "B"의 이해에 대한 답변을 제공

배열의 두 날짜 사이. 이 MySQL의에서 오는 경우 응답이 "A", dcneiner의 솔루션


없음 정렬 필요 없다! ...

를 참조하려면, 당신은이 DBMS에 직접 MIN과 MAX가 고려에 대한 값 반환 할 수 있습니다 명부.
편집 : Darkerstar가 지적한 것처럼 데이터 구조 [및 질문에 표시된대로 전체 목록을 반환하는 기존 SQL 쿼리] 방식은 일반적으로 MIN 및 MAX 값을 생성하는 쿼리가 구조화 된 이 같은
아마 뭔가 : 어떻게 든, 당신은 SQL을 사용할 수없는 경우

SELECT MIN(the_date_field), MAX(the_date_field) 
FROM the_table 
WHERE -- whatever where conditions if any 
--Note: no GROUP BY needed 

이 목록을 통해 단일 패스는 O (n)이 시간에 (목록에서 MIN과 MAX 값을 얻을 수 있습니다, 그건).
알고리즘은 간단합니다 :
[정렬되지 않은] 목록의 첫 번째 항목에 최소값과 최대 값을 설정하십시오.
목록의 다음 항목을 반복하여 최소값과 비교하고 작은 값으로 바꾸면 대체하고 최대 값을 같게합니다 ...

최소값과 최대 값을 손에 넣으면 간단합니다

다음
<?php 
$array = array('2009-03-11', '2009-03-12', '2009-04-12', '2009-05-03', '2009-10-30'); 

# may need this as suggested by dcneiner 
date_default_timezone_set("GMT"); 

$max = $array[0]; 
$min = $max; 
for($i = 1; $i < count($array); $i++){ 
    // Note that since the strings in the array are in the format YYYY-MM-DD, 
    // they can be compared as-is without requiring say strtotime conversion. 
    if ($array[$i] < $min) 
     $min = $array[$i]; 
    if ($array[$i] > $max) 
     $max = $array[$i]; 
} 
$day_count = (strtotime($max) - strtotime($min))/(60*60*24); 

?> 
+1

MIN과 MAX는 실제로 관련이 없습니다. 날짜 사이의 요일이 반드시 MIN 또는 MAX (날짜) 일 필요는 없습니다. 모든 행 사이에 DATEDIFF를 수행 할 수는 있지만 실제로 쓰는 방법을 모르겠습니다. – rrrfusco

+0

문제를 오해하지 않는 한, Min과 Max는 매우 관련이 있습니다. 배열에서 가능한 모든 날짜 쌍을 비교하려는 계획도 잘 작동 할 수 있지만이 접근법은 더 많은 작업을 수행하게됩니다. 최소값과 최대 값 ("지금까지")을 추적해야하는 것 외에도, 차이의 최소값/최대 값은 같지만 최소값/최대 값은 모두 같아야합니다. n * (n - 1) 차이점은 알고리즘 O (n^2)를 만듭니다. 모든 쌍의 생성을 관리하는 오버 헤드/복잡성은 말할 것도 없습니다. – mjv

+0

데이터를 작성하는 방법은 데이터 구조에 따라 다릅니다. 하나의 날짜 필드가있는 경우 과 같이 작성할 수 있습니다. mytable에서 TO_DAYS (MIN (mydate), MAX (mydate))를 선택하십시오. cust_id = xx group by cust_id " 한 행에 두 개의 날짜를 계산하려면, then : "numdays로 DATEDIFF (date1, date2)를 선택하십시오. 테이블에서 MAX (numdays) xxxx group by xxxx" – Darkerstar

1

이 PHP 스크립트는 당신에게 가장 큰 간격

1) {($ I = 0 을 줄 것이다; } } ?>
관련 문제