PHP MySQL每天在DatePeriod之间计数

时间:2016-04-20 17:34:42

标签: php date mysqli

我有一个DatePeriod

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

和带有工作日期的SQL表:

enter image description here

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

以下代码对我不起作用。

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

2 个答案:

答案 0 :(得分:0)

如果您正在尝试计算表中指定的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.

答案 1 :(得分:0)

奇怪的是,由于您的表只显示了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