所以我有这张桌子。它有几百行。每行中都有一个日期时间字段。我需要知道的是在给定的时间段内获得多少行,但不是整个时期,而是在此期间的每一天。直到这一点,我知道该怎么做。但此外,我还需要在表中没有任何行的行中包含值为0的行。
例如:
2012-01-01 12:13
2012-01-01 43:32
2012-01-03 23:32
应该给我这样的结果:
2012-01-01 2
2012-01-02 0
2012-01-03 1
任何人都可以帮忙吗?
答案 0 :(得分:3)
要处理带有0个相应记录的日期,我通常的做法是使用日历表加入。
例如,创建一个名为calendar_date
的字段的表格,并使用1st Jan 2000
到31st Dec 2070
的每个日期或其他适合您报告目的的范围填充该表格。
然后使用像...这样的东西。
SELECT
calendar.calendar_date,
COUNT(*)
FROM
calendar
LEFT JOIN
yourData
ON yourData.timeStamp >= calendar.calendar_date
AND yourData.timeStamp < calendar.calendar_date + 1
WHERE
calendar.calendar_date >= '01 Jan 2012'
AND calendar.calendar_date < '04 Jan 2012'
GROUP BY
calendar.calendar_date
此表可以有许多额外用途,例如标记银行假日,周和月的开始。谨慎使用标志和索引,你可以从中获得很多。
答案 1 :(得分:2)
如果您没有包含日期列表的表格,您可以使用以下查询进行模拟:
select * from
(select adddate('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) calendar_date from
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1,
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2,
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3,
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v
where calendar_date between ? /*start of date range*/ and ? /*end of date range*/
- 所以Dems的查询可能会变成:
SELECT
calendar.calendar_date,
COUNT(*)
FROM
(select * from
(select adddate('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) calendar_date from
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1,
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2,
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3,
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v
WHERE calendar_date >= '01 Jan 2012'
AND calendar_date < '04 Jan 2012'
) calendar
LEFT JOIN
yourData
ON yourData.timeStamp >= calendar.calendar_date
AND yourData.timeStamp < calendar.calendar_date + 1
答案 2 :(得分:0)
尝试
SELECT DATE_FORMAT(YourDate, '%Y-%m-%d') as YourDate, COUNT(*)
FROM TableName where YourDate= 'date'
GROUP BY YourDate