2014-09-04 2 views
0

Я делаю календарь с событиями в Codeigniter, поэтому хочу создать список этих событий, отсортированных по месяцам и годам.Выбор даты по месяцам и годам из базы данных

В базе данных у меня есть список событий, и я хочу получить затем по дате поля, которая использует тип данных DATE.

if($year != null and $month != null) 
    { 
     $this->db->where('date', '?'); 
    } 
    $events = $this->db->get('agenda')->result(); 

В основном у меня есть yyyy-mm для сравнения с yyyy-mm-dd.

Спасибо и извините за мой английский.

+0

Ваш вопрос непонятен, извините. Какой диапазон строк вам нужно получить? Кажется, вы хотите заказать их по годам и месяцам, как только вы их получите. Это правильно? –

+0

Я хочу получить все события, которые указаны в месяце и году, выбранном пользователем. Но в поле даты дата находится в формате yyyy-mm-dd. И у меня есть только информация yyyy-mm. –

ответ

1

Если предположить, что $this->db->where() делает AND field = value попробовать это.

$this->db->where("DATE_FORMAT(date,'%d')", $month); 
$this->db->where("DATE_FORMAT(date,'%Y')", $year); 

DATE_FORMAT() функция является MYSQL для управления датами/форматированием, так это должно приравнять к

WHERE 
    DATE_FORMAT(date,'%d') = '12' 
AND DATE_FORMAT(date,'%Y') = '2014' 

Или вы могли бы использовать

$this->db->where('MONTH(date)', $month); 
$this->db->where('YEAR(date)', $year); 
+0

Yeaaah! Большое спасибо! –

+1

Обратите внимание, что это правильное решение поражает использование индекса для поиска столбца 'date'. и поэтому может не работать так, как мог. –

-1

Этот вопрос должен решить вашу проблему!

SELECT * FROM table_name WHERE data_field_name >='01/10/2000' 

или

SELECT * FROM table_name WHERE data_field_name between '01/01/2009' and '01/01/2010'; //FOR YEAR 

или

SELECT * FROM table_name WHERE data_field_name between '01/01/2009' and '01/02/2009'; //FOR MONTH 
+0

Да, это должно быть, но у меня нет информации yyyy/mm/dd. Просто yyyy-mm. –

+0

Но за весь месяц вы просто просите показать с первого дня до последнего дня =).Вы также можете использовать функцию date() PHP, чтобы дать вам сегодняшнюю дату, точно так же: echo date ('Y/m/d') – brunoroc

+0

Это MYSQL. Строки даты 'yyyy-mm-dd' –

0

В MySQL ваш запрос должен быть, как этот

SELECT * FROM table_name WHERE data_field_name >='2000-10-1' //Y-m-d 

SELECT * FROM table_name WHERE data_field_name >='2000-10-1' AND data_field_name <='2014-10-1' 

SELECT * FROM table_name WHERE data_field_name >='2000-10-1' 

SELECT * FROM table_name WHERE data_field_name BETWEEN '2000-10-1' AND '2014-10-1' 

Вы можете сделать это также

SELECT * FROM table_name WHERE YEAR(data_field_name) >= '2010' AND MONTH(data_field_name) >='10' AND DAY(data_field_name) >= '1' 

и т.д ....

для вас использовать случай, я хотел бы сделать что-то вроде этого

SELECT 
    *, MONTH(date_field) as month 
FROM 
    table_name 
WHERE 
    something = '1' 
ORDER BY 
    month 
0

Лучший способ сделать это, как следует:

$monthstring = sprintf('%d-%d-01', $year, $month); /* make yyyy-mm-01 string */ 
$this->db->where ("date >= '$monthstring'"); 
$this->db->where ("date < '$monthstring' + INTERVAL 1 MONTH"); 

Это хороший способ сделать это, потому что он позволяет использовать индекс для поиска столбца date, если он окажется доступным.

Он расширяется до такого рода MySQL где предложение

WHERE date >= '2014-07-01' AND date < '2014-07-01' + INTERVAL 1 MONTH 

Это именно то, что вам нужно для сканирования диапазона индекса.

Смежные вопросы