我有一个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查询来计算Dateperiod by tagnr(daynumber)之间表格中的每一天
以下代码对我不起作用。
SELECT
COUNT(tagnr) AS totalsumme
FROM
arbeitszeiten
WHERE
tagnr IN ($period)
答案 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