2013-03-06 85 views
0

對於這個表:MySQL的GROUP BY年怪事

CREATE TABLE `items` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
`type` char(15) DEFAULT NULL, 
`ext_id` varchar(255) DEFAULT NULL, 
`timestamp` int(11) DEFAULT NULL, 
`title` varchar(255) DEFAULT NULL, 
`txt` text, 
`url` varchar(255) DEFAULT NULL, 
`longitude` float(9,6) DEFAULT NULL, 
`latitude` float(9,6) DEFAULT NULL, 
`meta` text, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=41695 DEFAULT CHARSET=utf8; 

有了數據,從2005年至2013年,所有的(INT)timestamp列,該查詢數據:

SELECT DATE_FORMAT(`timestamp`, '%Y') as 'year', 
COUNT(id) as 'total' 
FROM items 
GROUP BY DATE_FORMAT(`timestamp`, '%Y') 

返回此:

'year' => null 
'COUNT(*)' => string '38710' (length=5) 

'year' => string '2011' (length=4) 
'COUNT(*)' => string '45' (length=2) 

'year' => string '2012' (length=4) 
'COUNT(*)' => string '67' (length=2) 

'year' => string '2013' (length=4) 
'COUNT(*)' => string '90' (length=2) 

爲什麼我沒有得到正確的結果? 當我迭代SELECT * FROM items時,我在打印<?php print date('Y-m-d H:i', $item->timestamp); ?>時得到正確的日期,所以日期在那裏。

+1

看看的選擇輸出*從項目,其中DATE_FORMAT('timestamp',「%Y」)爲空 – palindrom 2013-03-06 14:13:33

+0

@palindrom - 嗯,是的,空的很多......但爲什麼呢?正如我所說,PHP可以從任何結果中獲取完整日期。 – 2013-03-06 14:16:39

+0

@MichaelBerkowski - 好吧,不是一次全部.. – 2013-03-06 14:16:58

回答

2

DATE_FORMAT想要一個MySQL日期類型作爲它的參數,而不是一個表示UNIX時間戳的整數。如果您將日期存儲爲UNIX時間戳(順便說一句,您通常不應該這樣做),那麼您需要將其轉換爲FROM_UNIXTIME()。還有一個返回一年的YEAR()函數,比使用DATE_FORMAT更簡潔一點。

所以,概括地說,你想YEAR(FROM_UNIXTIME(timestamp))

+0

太棒了!我知道我應該使用某種類型的MySQL日期類型,但這是我擁有的數據。 – 2013-03-06 14:19:50