首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在PHP中选择具有非空值的最新日期(给定周末和无工作天数

在PHP中选择具有非空值的最新日期(给定周末和无工作天数
EN

Stack Overflow用户
提问于 2012-08-07 16:32:51
回答 1查看 205关注 0票数 1

因此,我的MySQL数据是这样组织的:

代码语言:javascript
运行
复制
>   id_nom  simbol  data              val             close           min       
>   3        BET    2010-02-26  5328.4502          5328.4502    5317.2400

和一个表单,根据选择来选择开始和结束日期:第一次选择是日期,第二次选择是月份,第三次选择是年。

问题在于日期是周末和节假日,这些天的值是最后报告的工作日的值。因此,例如,对于BET,星期五是5328.4502,星期日,它将与星期五的值相同,尽管在数据库中没有星期日、星期六或任何其他假日的日期。

我的解决方案如下:

我做了一个函数来选择给定日期的开始和结束日期。这就是它:

代码语言:javascript
运行
复制
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)));
}

以及一个使用数组切片从一周中提取日期的函数。这就是它:

代码语言:javascript
运行
复制
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);
}

并像这样使用它们:

代码语言:javascript
运行
复制
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);                
    }

特定于$arr2$arr将包含如下数组:

代码语言:javascript
运行
复制
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"
}

因此,基本上,我使用endarray_filter选择一周中不为空的最后一天。

更具体地说,我的问题如下:

如果我选择开始日期: 12-12-2010周日,$arr将包含从13个星期一开始的一周的日期,而我需要从最后一个星期一开始的日期,即6。

你知道为什么会这样吗,你觉得我是不是有点太复杂了?你有什么简单的方法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-09 19:37:25

我修改了我的查询如下:

代码语言:javascript
运行
复制
SELECT * FROM ind_cotatii WHERE id_nom=3 AND `data` >= 'DATE_SUB('".$data_start."',INTERVAL 1 WEEK)' AND `data` <= '".$data_end."' ";

它之所以有效,是因为它考虑了前一周,因此该周的最后一个值,逻辑是显而易见的。就像在原始表单中一样,如果我进入周日,由于查询,它会选择13,那就是下周一,完全错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11842047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档