2014-10-10 2 views
1

У меня есть эта таблица в моей базе данных:SQL порядок большинства последних дат

INSERT INTO `shop_stats` (`date`, `value`) VALUES 
('09/2014', 326), 
('08/2014', 1007), 
('07/2014', 1108), 
('06/2014', 1027), 
('05/2014', 895), 
('04/2014', 650), 
('03/2014', 683), 
('02/2014', 563), 
('01/2014', 499), 
('12/2013', 568), 
('11/2013', 522), 
('10/2013', 371), 
('09/2013', 347), 
('08/2013', 376), 
('07/2013', 418), 
('06/2013', 567), 
('05/2013', 357); 

мне нужно найти способ, чтобы отобразить последние 12 месяцев.

Я попытался это:

SELECT * FROM shop_stats ORDER BY date DESC LIMIT 12 

Но он не работает правильно.

Любые предложения?

+0

Какого результата у вас о запросе? –

+1

Хранить даты в правильном формате даты. –

ответ

0

Вы можете просто использовать STR_TO_DATE так

SELECT 
* 
FROM 
shop_stats 
order by 
STR_TO_DATE(date, '%m/%Y') DESC LIMIT 12 

Demo

1
SELECT * FROM shop_stats WHERE date >= DATE_SUB(NOW(),INTERVAL 1 YEAR) LIMIT 12 
+0

Это не будет работать с псевдодатами, хранящимися в виде строк. – zessx

+0

О, спасибо, я этого не видел. Но по-прежнему есть хороший ответ от Gordon – derdida

1

Ваши «даты» хранятся в виде строк, предположительно с первым месяцем. Таким образом, следующий order by должен работать

order by right(date, 4), left(date, 2) 

Вам нужно поставить за год до месяца для заказа целей.

Если вы хотите последние двенадцать месяцев, я бы рекомендовал:

where right(date, 4) * 12 + left(date, 2) >= year(now()) * 12 + month(now()) 
order by right(date, 4), left(date, 2) 

where оператор преобразует даты в несколько месяцев, и для столбца «дата» в ваших данных и для текущего времени ,

+0

, почему вы просто не добавляете 'DESC LIMIT 12' в свой первый запрос вместо добавления условия? – krishna

+0

@krishna. , , Как я узнаю, что у каждого из предыдущих 12 месяцев есть данные? –

0

Вы можете посмотреть на DATE_SUB

SELECT * FROM shop_stats where date >= DATE_SUB(now(), INTERVAL 12 MONTH) ORDER BY date 

Edit: Как о преобразовании строки датировать & делать соответствующие операции дат в SQL Server?

SELECT DATE 
    ,t1.value 
FROM (
    SELECT DATE 
     ,STR_TO_DATE(CONCAT (
       '01/' 
       ,DATE 
       ), '%d/%m/%Y') date_ 
     ,value 
    FROM shop_stats 
    ) t1 
WHERE t1.date_ >= DATE_SUB(now(), INTERVAL 12 MONTH) 
ORDER BY t1.date_ DESC 

http://sqlfiddle.com/#!2/2be05/8

+0

Это не будет работать с псевдодатами, хранящимися в виде строк. – zessx

0

Я считаю, что ваша дата поле имеет строку типа

Так вы попробуете это:

SELECT * FROM shop_stats 
ORDER BY SUBSTRING(date, 4, 4) desc, 
substring(date, 1, 2) DESC LIMIT 12 

Показать Sql Fiddle

0

выберите * из shop_stats где дата> = (NOW) (- ИНТЕРВАЛ 12 МЕСЯЦА) ORDER BY даты

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