У меня есть столбец в моей базе данных 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 и сохраните свою работу 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.
Здесь, 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.
$q="SELECT * FROM projects WHERE YEAR(date) = 2012 AND MONTH(date) = 1;
Вы можете сделать так:
$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 – Дополнительная информация
для получения значений месяца и года из столбца даты
select year(Date) as "year", month(Date) as "month" from Projects
Да, это работает, но он возвращает одну строку только в том случае, когда есть несколько строк для извлечения, используя только выбранные столбцы. Подобно SELECT Title, Date FROM mytable WHERE YEAR (Date) = 2017 AND MONTH (Date) = 09 возвращает только одну строку.