【问题标题】:Select latest date with non-null values, given weekends and work-free days in PHP选择具有非空值的最新日期,在 PHP 中给定周末和无工作日
【发布时间】:2012-08-07 08:32:51
【问题描述】:

所以,我的 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"
}

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

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

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

任何想法为什么会发生这种情况,你是否认为我有点过于复杂了? 你有什么简单的方法吗?

【问题讨论】:

  • 我不确定我是否理解您想要实现的目标。例如,如果用户从下拉列表中选择一个星期天,您希望将其转换为下一个星期一吗?
  • 不,如果用户选择星期日,正如 strtotime 指出的那样,它将选择“上周一”,然后 array_slice 它将获取当前周和该周的最后一个值,与星期天。但似乎如果我输入 2012-12-12 doesnt pick up 6, it picks 13, even though Ive 专门将 strtotime 设置为“上周一”。
  • 为什么不简单地查询日期
  • @svinja 这将是一个很好的解决方案,只是我需要开始和结束日期、值

标签: php mysql algorithm date


【解决方案1】:

我已将查询修改如下:

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

之所以有效,是因为它考虑了前一周,因此是该周的最后一个值,逻辑很明显。就像原来的形式一样,如果我输入 sunday,由于查询,它会选择 13 并且那是下星期一,完全错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 2012-02-05
    • 2022-01-20
    • 1970-01-01
    • 2023-03-12
    • 2020-08-13
    • 1970-01-01
    相关资源
    最近更新 更多