所以,我的 MySQL 数据是这样组织的:
> id_nom simbol data val close min
> 3 BET 2010-02-26 5328.4502 5328.4502 5317.2400
还有一个表格,根据选择来选择开始和结束日期:第一个选择是日期,第二个选择是月份,第三个选择是年份。
问题在于周末和节假日的日期,这些天的值是工作日的最后报告值。因此,例如,BET 的 friday 是 5328.4502,而 sunday 的值将与 friday 相同,尽管 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
所以基本上,我使用and选择一周中不为空的最后一天array_filter
。
我的问题,更具体地说,如下:
如果我选择开始日期:12-12-2010 星期日,$arr
将包含从星期一 13 开始的一周的日期,而我需要从最后一个星期一开始的日期,即 6。
任何想法为什么会发生这种情况,你是否认为我有点过于复杂了?你有什么简单的方法吗?