Ответ 1
SELECT * FROM projects WHERE YEAR(Date) = 2011 AND MONTH(Date) = 5
У меня есть столбец в моей базе данных mySQL с несколькими строками. Одна из этих строк - DATE, например: 2012-02-01
То, что я хочу достичь, - это сделать SELECT с PHP на основе только года и месяца.
Логика SELECT будет следующей:
$q="SELECT * FROM projects WHERE Date="SELECT HERE THE SPECIFIC YEAR AND MONTH"";
Конкретный месяц и год будут передаваться из переменной $_POST
, например, $_POST['period']="2012-02";
Как я могу это сделать?
SELECT * FROM projects WHERE YEAR(Date) = 2011 AND MONTH(Date) = 5
Если у вас есть
$_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 и сохраните свою работу DB. Таким образом, вы можете эффективно использовать индекс в столбце 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.
$q="SELECT * FROM projects WHERE YEAR(date) = 2012 AND MONTH(date) = 1;
Вы можете сделать следующее:
$q="SELECT * FROM projects WHERE Year(Date) = '$year' and Month(Date) = '$month'";
Здесь запись FIND по MONTH и DATE в mySQL
Вот ваше значение POST $_POST['period']="2012-02";
Просто взорвите значение тире $Period = explode('-',$_POST['period']);
Получить массив из значения разрыва:
Array
(
[0] => 2012
[1] => 02
)
Поместить значение в SQL Query:
SELECT * FROM projects WHERE YEAR(Date) = '".$Period[0]."' AND Month(Date) = '".$Period[0]."';
Получите результат MONTH и YEAR.
Логика будет:
SELECT * FROM objects WHERE Date LIKE '$_POST[period]-%';
Оператор LIKE
выберет все строки, начинающиеся с $_POST['period']
, за которыми следуют тире и день mont
http://dev.mysql.com/doc/refman/5.0/en/pattern-matching.html - Дополнительная информация
чтобы получить значения месяца и года из столбца даты
select year(Date) as "year", month(Date) as "month" from Projects
Вот запрос, который я использую, и он будет возвращать каждую запись в течение периода в виде суммы.
Вот код:
$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 и сумма месячных часов, которые они накопили.
Предположим, у вас есть поле базы данных create_at, где вы берете значение из отметки времени. Вы хотите выполнить поиск по году и месяцу с даты создания.
YEAR(date(created_at))=2019 AND MONTH(date(created_at))=2
Да, это работает, но он возвращает только одну строку, только если несколько строк извлекаются только с использованием выбранных столбцов. Как SELECT Title, Date FROM mytable ГДЕ ГОД (дата) = 2017 И МЕСЯЦ (дата) = 09 возвращает только одну строку.