1

したがって、私のMySQLデータは次のように編成されています。

>   id_nom  simbol  data              val             close           min       
>   3        BET    2010-02-26  5328.4502          5328.4502    5317.2400

また、選択に基づいて開始日と終了日を選択するためのフォーム。最初の選択は日付、2番目の選択は月、3番目の選択は年です。

問題は、週末と休日の日付にあります。これらの日の値は、営業日の最後に報告された値です。したがって、たとえば、BETの金曜日は5328.4502であり、日曜日の場合、DBには日曜日、土曜日、またはその他の休日の日付はありませんが、金曜日と同じ値になります。

私の解決策は次のとおりです。

日付を指定して開始日と終了日を選択する関数を作成しました。ここにあります:

function x_week_range($date) {
  $ts = strtotime($date);
  $start = (date('N', $ts) == 1) ? $ts : strtotime('Last Monday', $ts);
  return array(date('Y-m-d', $start),
    date('Y-m-d', strtotime('Next Sunday', $start)));
}

また、配列スライスを使用して、週から日付を抽出する関数。ここにあります:

function array_slice_assoc ($array, $key, $length, $preserve_keys = true)
{
    $offset = array_search($key, array_keys($array));

    if (is_string($length))
        $length = array_search($length, array_keys($array)) - $offset;

    return array_slice($array, $offset, $length, $preserve_keys);
}

そして、これらの両方を次のように使用しました:

list($start_day_week,$end_day_week)=x_week_range($data_start);
list($start_day_week2,$end_day_week2)=x_week_range($data_end);


$strSql="SELECT * FROM ind_cotatii WHERE id_nom=3 AND `data` >= '".$data_start."' AND `data` <= '".$data_end."' ";

$objDbResult = $objDatabase->Query($strSql);

while($mixRow = $objDbResult->FetchArray())
    {
        $datInd[$mixRow['data']]=$mixRow['val'];
    }
    if(isset($datInd[$data_start]))
    {
        $first_value=$datInd[$data_start];
    }
    if(isset($datInd[$data_end]))
    {
        $last_value=$datInd[$data_end];
    }


    if(!isset($first_value))
    {
        $arr=array_slice_assoc($datInd,$start_day_week,6,true);
        $first_value=end(array_filter($arr));
        var_dump('calc_we1',$arr,$start_day_week,$first_value);
    }

    if(!isset($last_value))
    {
        $arr2=array_slice_assoc($datInd,$start_day_week2,6,true);
        $last_value=end(array_filter($arr2));
        var_dump('calc_we2',$arr2,$start_day_week2,$last_value);                
    }

具体$arr$arr2には、次のような配列が含まれます。

Array(6) {
  ["2010-12-13"]=>
  string(9) "5155.9800"
  ["2010-12-14"]=>
  string(9) "5154.6802"
  ["2010-12-15"]=>
  string(9) "5146.3398"
  ["2010-12-16"]=>
  string(9) "5138.5098"
  ["2010-12-17"]=>
  string(9) "5149.9800"
  ["2010-12-20"]=>
  string(9) "5133.9302"
}

endしたがって、基本的には、とを使用してnullではない週の最後の日を選択しますarray_filter

私の問題は、より具体的には次のとおりです。

開始日を選択した場合:2010年12月12日日曜日、に$arrは13月曜日から始まる週の日付が含まれますが、最後の月曜日である6から始まる日付が必要です。

なぜこれが起こるのか、何か考えはありますか?また、私が少し複雑にしすぎたと思いますか?簡単な方法はありますか?

4

1 に答える 1

0

クエリを次のように変更しました。

SELECT * FROM ind_cotatii WHERE id_nom=3 AND `data` >= 'DATE_SUB('".$data_start."',INTERVAL 1 WEEK)' AND `data` <= '".$data_end."' ";

前の週、つまりその週の最後の値を考慮に入れるため、これは機能します。ロジックは明らかです。元の形式のように、日曜日に入力した場合、クエリのために、13を選択し、次の月曜日は完全に間違っていました。

于 2012-08-09T11:37:24.933 に答える