【问题标题】:Loop through Dates in database and calculate days remaining to the date on each row遍历数据库中的日期并计算每行日期的剩余天数
【发布时间】:2017-09-28 08:15:32
【问题描述】:

我试图弄清楚如何遍历数据库并计算剩余天数,直到每行的单个日期。

日期格式 2017 年 6 月 15 日 m/d/y 但打印时显示 y/m/d,如问题后面所示。 (目前在 DB 中作为 varchar,这将更改为 DATE)

堆栈信息:Xampp 5.6.30 (Apache + MariaDB + PHP + Perl) 我不使用 Perl。

我已经得到了一个包含所有日期的数组。

这是获取数组的代码: $dates = 数组();

$Kal_get = "SELECT Next_Kal FROM Maaleinstrumenter_final";
$Result = mysqli_query($conn, $Kal_get);
WHILE ($Row = mysqli_fetch_assoc($Result))

此外,我已经成功计算了 1 行(日期不是正确的,应该用 $Row 中的数据填充)

$date = strtotime("December 3, 2009");
$remaining = $date - time();  
WHILE($day = floor($remaining / 86400));
Echo $day;

这两个脚本没有连接在一起,因为我试图创建一个循环计算的变量,但它无休止地循环。这可以通过将其嵌套在 if 语句中来解决。

我将如何加入 2 个脚本并获得 300 多个结果并将它们分成 3 组(超过一个月、不到一个月和不到 10 天)

我观察到的事情: 组装数组的诡计循环以某种方式显示为 360 多个数组,如此处所示,$Row 上有 2 行 var_dump,而不是像 $x['1'], $x['2'] 这样的 1 数组,依此类推:

array(1) { ["Next_Kal"]=> string(10) "1993-12-12" } 
array(1) { ["Next_Kal"]=> string(10) "0000-00-00" }

我早些时候犯了错误并重置了日期的所有数据,我更改了第一行以显示示例。

【问题讨论】:

    标签: php mysql arrays date calculation


    【解决方案1】:

    使用mysql的DATEDIFF函数:

    SELECT Next_Kal, DATEDIFF(NOW(), Next_Kal) as Days_Remaining
    FROM Maaleinstrumenter_final
    

    【讨论】:

    • 那么这将创建一个看起来像 $x['1'] 的数组,其中填充了所有计算?
    • 假设您使用 while($x=mysqli_fetch_array($result)) 作为循环,那么 $x['0'] 将包含存储在数据库中的日期,并且 $x[' 1'] 将包含从现在到 $x['0'] 中特定日期的天数。
    • 我刚试了一下,var_dump 显示天数的计算是正确的+1,这很好,但它显示为“-75”,我可以忍受,因为没关系对我来说,只要有正确的天数 :-) 我将如何循环它并根据剩余的天数将数组拆分为 3 个数组?
    • 您能否给我看一个基于示例数据库数据的预期结果示例?
    • 我会尽力的。假设我运行你给我的脚本,它在数组中输出 360+ 行。其中 100 个超过 2 个月(在回显表中变为绿色) 100 个小于一个月(在回显表中变为黄色) 160 个小于 10 天(在回显表中变为红色)我认为可以实现的方法是将If`` and Ifelse`和Ifelse添加到循环中,例如:If(date_Remaining > 30){Code that puts that row into array 1 (Green)}Ifelse(date_Remaining <=30){Code that puts that row into array 2 (Yellow)Ifelse(date_Reamining < 10){Code that put that row into array 3 (Red)}
    【解决方案2】:

    如果每行的单个日期在数据库级别是已知的,则使用 Kevin 指出的DATEDIFF 函数。此外,其他一些 DBMS(不确定 MySQL)允许在两个日期之间进行简单的数学运算,例如 (date1 - date2) as delta_days

    如果您以后知道日期,在 PHP 级别,然后使用 DateTime 类,diff 方法。使用起来更加简单和安全。它可能需要很多输入格式作为日期,然后再进行数学运算。

    【讨论】:

    • 我的日期与 Kevin 提供的不同,现在我只需要将它们分成 3 个数组并计算每个数组中的行数 :-)
    • 可以在 SQL 中使用case 语句,在范围/颜色中分隔句点,或者在 php 中也使用大小写。请在您的问题中更具体。您从“计算天数”开始,并在回显 html 表时以“绿色/红色”结束。
    • 你误会了,Kevin 带我走正路,我快到终点了红/黄/绿只是举例说明表格在获取天数时的行为离开,它与计算本身无关。 :-)
    【解决方案3】:

    我一直在修修补补,因为它不完全适合,这就是我最终作为一个成功的脚本来计算剩余 366 行上的日期。

    $Kal_get = "SELECT Bunny_No, Next_Kal, DATEDIFF(NOW(), Next_Kal) FROM Maaleinstrumenter_final";
    $Result = mysqli_query($conn, $Kal_get);
    $a = 30;
    $b = 10;
    $moreThan2Months = array();
    $lessThan1Month = array();
    $lessThan10Days = array();
    
    while($Row = mysqli_fetch_array($Result))
    {
    $absoluteDays = abs($Row['DATEDIFF(NOW(), Next_Kal)']);
    if($absoluteDays > $a) {$moreThan2Months[] = ($Row['DATEDIFF(NOW(), Next_Kal)']);}
    elseif($absoluteDays < $a && $absoluteDays >$b) {$lessThan1Month[] = $Row['DATEDIFF(NOW(), Next_Kal)'];}
    elseif($absoluteDays < $b) {$lessThan10Days[] = $Row['DATEDIFF(NOW(), Next_Kal)'];}}
    echo count(array_filter($lessThan1Month));
    ?> 
    

    它正在成功计算日期并将它们放入$absoluteDays 并根据If/Ifelse 语句将它们分成3个数组,然后进行计数和过滤以仅显示数组内的非NULL元素,使其能够动态计数。
    感谢我在这个问题上收到的所有帮助,非常感谢!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-13
      • 2019-03-27
      • 1970-01-01
      • 2014-11-26
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多