Просмотр SQL для отображения интервала 12 месяцев и по годам

Прямо сейчас один из других программистов написал это представление, чтобы показать интервал в 6 месяцев. Как мне написать это, чтобы он показывал интервал в 12 месяцев, сгруппированных по месяцам, но только за 2011 год

Я хотел бы скопировать его для отдельного просмотра 12 месяцев, сгруппированных по месяцам, но только для 2012 года.

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`%` 
SQL SECURITY DEFINER VIEW `vw_dash_bymonth`AS
select 
  month(from_unixtime(`tbl_services`.`datetime`)) AS` month1`,
  date_format(from_unixtime(`tbl_services`.`datetime`),'%Y') AS` year1`,
  date_format(from_unixtime(`tbl_services`.`datetime`),'%d') AS `day1`,
 `tbl_services`.`datetime` AS `realdate`,sum(`tbl_services`.`gallons`) AS `gallons`,
 count(0) AS `service`,
 round(avg(`tbl_services`.`gallons`),1) AS `average`
from `tbl_services`
where (from_unixtime(`tbl_services`.`datetime`) > (now() - interval 6 month))
group by month(from_unixtime(`tbl_services`.`datetime`))

person Hector    schedule 21.01.2012    source источник


Ответы (1)


Если вы посмотрите на предложение where

where (from_unixtime(`tbl_services`.`datetime`) > (now() - interval 6 month))

Я считаю, что это даты от 6 месяцев назад до сегодняшнего дня. Если вы хотите 12 месяцев в 2011 году, я думаю, вы можете заменить эту строку чем-то вроде:

where (from_unixtime(`tbl_services`.`datetime`) >= DATE('2011-01-01 00:00:00')) 
  AND (from_unixtime(`tbl_services`.`datetime`) < DATE('2012-01-01 00:00:00'))

Хотя я не знаю MySQL (только SQLServer), поэтому, если это не сработает, надеюсь, кто-нибудь другой скажет мне, где я ошибся.


Его можно упростить до:

where (from_unixtime(`tbl_services`.`datetime`) >= '2011-01-01') 
  AND (from_unixtime(`tbl_services`.`datetime`) < '2012-01-01')
person Mike    schedule 21.01.2012
comment
В нем упоминалось, где / в какой части? - person Mike; 22.01.2012
comment
Когда я вставляю, это говорит о синтаксической ошибке со следующей строкой в ​​группе по месяцам (from_unixtime (_1 _._ 2_)) - person Hector; 22.01.2012
comment
Хорошо, я предполагаю, что это может быть потому, что я использовал DATE, а не DATETIME, я посмотрю, что возвращает from_unixtime. А пока вы можете попробовать заменить DATE на DATETIME? - person Mike; 22.01.2012
comment
Отсутствие DATETIME дает мне ошибку в круглой скобке DATETIME ('2011-01-01 - person Hector; 22.01.2012
comment
Хорошо, это, возможно, длинный снимок, но попробуйте заменить DATE( на from_unixtime(UNIX_TIMESTAMP( - person Mike; 22.01.2012
comment
Некоторые скобки на концах отсутствуют. - person ypercubeᵀᴹ; 22.01.2012
comment
нет, ошибка в следующей строке группы, где (from_unixtime (_1 _._ 2_) ›(from_unixtime (UNIX_TIMESTAMP ('2011-01-01 00:00:00')) AND (from_unixtime (_3 _._ 4_)‹ (from_unixtime (UNIX_TIMESTAMP ( '2012-01-01 00:00:00')) группа по месяцам (from_unixtime (_5 _._ 6_)) - person Hector; 22.01.2012
comment
У вас есть лишняя скобка, я считаю, удалите (перед обоими вашими (from_unixtime, которые вы только что добавили - person Mike; 22.01.2012
comment
@ypercube, вы правы, мне не хватало скобок, знаете ли вы, нужно ли целиком заключить в скобки предложение where? Гектор попробуйте новое редактирование, в котором скобки зафиксированы, и посмотрите, работает ли оно. - person Mike; 22.01.2012
comment
Теперь ошибка в изогнутой скобке после DATETIME --- где from_unixtime (_1 _._ 2_) ›(DATETIME ('2011-01-01 00:00:00')) AND from_unixtime (_3 _._ 4_)‹ (DATETIME ('2012-01 -01 00:00:00 ')) группа по месяцам (from_unixtime (_5 _._ 6_)) --- извините за мой синтаксис - person Hector; 22.01.2012
comment
Нет, ничего лишнего не нужно. И вы можете заменить DATE('2011-01-01 00:00:00') на '2011-01-01' - person ypercubeᵀᴹ; 22.01.2012
comment
Небольшая поправка. > DATE(...) должен быть: >= DATE(...) - person ypercubeᵀᴹ; 22.01.2012