Answers:
如果你有
$_POST['period'] = "2012-02";
首先,找到每月的第一天:
$first_day = $_POST['period'] . "-01"
然后,Date
如果您有一个索引,此查询将使用索引:
$q = "
SELECT *
FROM projects
WHERE Date BETWEEN '$first_day'
AND LAST_DAY( '$first_day' )
" ;
也可以使用包含/排除间隔,该间隔效果很好(您不必担心列是DATE
,DATETIME
还是TIMESTAMP
,也不必担心精度:
$q = "
SELECT *
FROM projects
WHERE Date >= '$first_day'
AND Date < '$first_day' + INTERVAL 1 MONTH
" ;
安全警告:
您应该正确地转义这些值或使用准备好的语句。简而言之,请使用目前在PHP中推荐的任何方法,以避免任何SQL注入问题。
干得好。将计算工作留给PHP并保存您的数据库一些工作。这样,您可以有效利用Date
列上的索引。
<?php
$date = $_POST['period'];
$start = strtotime($date);
$end = strtotime($date . ' 1 month - 1 second');
$query = sprintf(
'SELECT *
FROM projects
WHERE Date BETWEEN FROM_UNIXTIME(%u) AND FROM_UNIXTIME(%u)',
$start,
$end
);
编辑
忘记了Unix时间戳转换。
$end = strtotime($date .' 1 month - 1 second');
您可以这样:
$q="SELECT * FROM projects WHERE Year(Date) = '$year' and Month(Date) = '$month'";
逻辑将是:
SELECT * FROM objects WHERE Date LIKE '$_POST[period]-%';
该LIKE
运营商将选择与开始的所有行$_POST['period']
的山的天,随后为破折号和
http://dev.mysql.com/doc/refman/5.0/en/pattern-matching.html-一些其他信息
这是我使用的查询,它将在一段时间内返回总和的每条记录。
这是代码:
$result = mysqli_query($conn,"SELECT emp_nr, SUM(az)
FROM az_konto
WHERE date BETWEEN '2018-01-01 00:00:00' AND '2018-01-31 23:59:59'
GROUP BY emp_nr ASC");
echo "<table border='1'>
<tr>
<th>Mitarbeiter NR</th>
<th>Stunden im Monat</th>
</tr>";
while($row = mysqli_fetch_array($result))
{
$emp_nr=$row['emp_nr'];
$az=$row['SUM(az)'];
echo "<tr>";
echo "<td>" . $emp_nr . "</td>";
echo "<td>" . $az . "</td>";
echo "</tr>";
}
echo "</table>";
$conn->close();
?>
这列出了每个emp_nr以及它们累计的每月小时数的总和。