【问题标题】:PHP MySQL Count every day between DatePeriodPHP MySQL 计数 DatePeriod 之间的每一天
【发布时间】:2016-04-20 17:34:41
【问题描述】:

我有一个 DatePeriod

$start  = new DateTime('2016-03-01');
$end    = new DateTime('2016-03-01 + 1 month');
$period = new DatePeriod($start, new DateInterval('P1D'), $end);

还有一个带有工作日期的 SQL 表:

现在我需要一个 SQL 查询来通过 tagnr (daynumber) 计算表中 Dateperiod 之间的每一天

以下代码对我不起作用。

SELECT 
  COUNT(tagnr) AS totalsumme
FROM 
  arbeitszeiten
WHERE 
  tagnr IN ($period)

【问题讨论】:

  • $period 不包含任何 MySQL 可以理解的内容
  • 我怎样才能做到这一点。我想显示一个月,而mysql应该按天数计算表中的所有天数
  • 史蒂夫,这是个无稽之谈。再尝试问一些有意义的问题!

标签: php date mysqli


【解决方案1】:

如果您尝试计算表中包含在指定 php 日期期间的日期数,那么我看到的唯一无法解决的问题是您发布的数据不包含实际日期。特别是 tagnr 似乎是一周中的第几天(周一至周日:1-7)。

让我们假设您的表格数据确实包含实际日期:

id      tag             tagnr   ddate
1       Montag          1       2016-03-07
2       Dienstag        2       2016-03-08
3       Mittwoche       3       2016-03-09
4       Donnerstag      4       2016-03-10
5       Freitag         5       2016-03-11

那么使用范围内的日期构建sql查询的任务并不难:

<?php

$start  = new DateTime('2016-03-01');
$end    = new DateTime('2016-03-01 + 1 month');
$period = new DatePeriod($start, new DateInterval('P1D'), $end);

$date_range = "";

// iterate through date range and build up sql string
foreach($period as $date){
    // append each date, comma delimited
    $date_range .= "'" . $date->format("Y-m-d") . "',";
}
// trim trailing comma
$date_range = rtrim($date_range,",");

$sql = "
  SELECT 
    COUNT(tagnr) AS totalsumme
  FROM 
    arbeitszeiten
  WHERE 
    ddate IN ($date_range)
";

// execute $sql with mysqli, PDO, etc.

【讨论】:

    【解决方案2】:

    奇怪的是,由于您的表格仅显示 5 个典型工作日,那么我想知道您是否打算实际计算您指定的 php 日期间隔中存在多少个工作日(来自表格)。在这种情况下,您可以在从德语翻译后使用 php 日期格式。此外,除非您一周中的工作日发生变化,否则为该信息访问数据库是没有意义的,因此您应该将其硬编码在一个数组中。如果它们正在发生变化,那么根据我的其他答案,您还需要上下文的实际日期。但是,要查找指定 php 日期范围内的工作日数,以下代码将执行此操作:

    <?php
    
    $working_days = array(
      "Monday",
      "Tuesday",
      "Wednesday",
      "Thursday",
      "Friday"
    );
    
    $start  = new DateTime('2016-03-01');
    $end    = new DateTime('2016-03-01 + 1 month');
    $period = new DatePeriod($start, new DateInterval('P1D'), $end);
    
    $count_of_working_days = 0;
    
    // iterate through date range and count each instance
    foreach($period as $date){
        // get the day of the week from the date
        $day_of_week = $date->format('l');
        // check if it's one of the working days
        if (in_array($day_of_week,$working_days))
          $count_of_working_days++;
    }
    
    echo $count_of_working_days;
    

    输出:

    23

    【讨论】:

      猜你喜欢
      • 2011-06-13
      • 1970-01-01
      • 2013-01-07
      • 2016-11-02
      • 1970-01-01
      • 2013-02-15
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多