2009-03-04 65 views
4

我今天从这里获得了解决问题的良好方向,但是我试图按照这个方向卡住。今天,昨天...以及其他时间添加了计数行

我想使用我的日期字段检索过去30天内表中所有行的计数。我使用“now()”填充这些字段,格式为“2009-03-04 14:58:01”。

  • 我需要的行计数今天加入 ,昨日,3天前...等
  • 我想那我可以用上面 得到每个月的计数?
  • 最后一个计数的年份,年份 之前等使用月份作为总计?

我一直希望不要在我的查询中指定日期,并且查询只是通用的,并且计算相对于今天的计数。考虑到不同的月份有不同的天数,我也希望能够准确地做到这一点。

我怎样才能得到这个计数使用只是SQL?然后我可以使用结果集作为数组,并用PHP解析这个结果集。

+0

嗯,为什么只是SQL?为什么不把这些逻辑放在应用程序代码中? – jonstjohn 2009-03-04 16:41:15

+0

我希望在数据库查询层面能够更容易,更高效,不是吗? – Abs 2009-03-04 16:43:15

回答

7

的记录数插入昨天:

select count(*) from mytable where date(myfield)=date(date_sub(now(),interval 1 day)); 

对于年:

select count(*) from mytable where year(myfield)=year(now()); 

等等......

0

查找到DATEDIFF ......我不知道MySQL的确切的语法,但它应该最终被someing类似于:

select * from Table WHERE datediff(StartDate, Today) < DaySpan 
2

我并不完全相信你的数据库结构如下喜欢,但你或许可以实现你想要的使用GROUP BY:

按天汇总:

SELECT date(my_date_field) d, count(*) c FROM tbl 
GROUP BY d 
ORDER BY d 

要按月汇总:

SELECT year(my_date_field) y, month(my_date_field) m, count(*) c FROM tbl 
GROUP BY y, m 
ORDER BY y, m 

要按年份汇总,只需从上面的示例中删除月份参数即可。

如果您想将结果限制为特定值,可以直接在my_date_field上使用WHERE或在d,y或m上使用WHERE。使用DATE_SUB计算相对于当前的日期。

0

尝试基于由日,月和年分组该解决方案:

-- Testing data 
DECLARE @TestTable TABLE(ID INT, AddDate DATETIME) 
INSERT INTO @TestTable 
SELECT 1, '2009-03-04 14:58:01' UNION 
SELECT 1, '2009-05-14 14:58:01' UNION 
SELECT 1, '2009-05-14 14:58:02' UNION 
SELECT 1, '2009-05-24 14:58:01' UNION 
SELECT 1, '2009-05-24 14:58:02' UNION 
SELECT 1, '2009-05-24 14:58:03' UNION 
SELECT 1, '2009-07-04 14:58:01' UNION 
SELECT 1, '2009-09-04 14:58:01' UNION 
SELECT 1, '2010-01-04 14:58:01' UNION 
SELECT 1, '2010-03-04 14:58:01' UNION 
SELECT 1, '2010-03-04 14:58:02' 

-- MySQL Answer 
-- for each day 
SELECT EXTRACT(YEAR_MONTH_DAY, AddDate), COUNT(ID) FROM @TestTable 
GROUP BY EXTRACT(YEAR_MONTH_DAY, AddDate) 
-- for each month 
SELECT EXTRACT(YEAR_MONTH, AddDate), COUNT(ID) FROM @TestTable 
GROUP BY EXTRACT(YEAR_MONTH, AddDate) 
-- for each year 
SELECT EXTRACT(YEAR, AddDate), COUNT(ID) FROM @TestTable 
GROUP BY EXTRACT(YEAR, AddDate) 

-- SQL Answer 
-- for each day 
SELECT dateadd(day, datediff(day, 0, AddDate)+0, 0), COUNT(ID) 
FROM @TestTable 
GROUP BY dateadd(day, datediff(day, 0, AddDate)+0, 0) 
-- for each month 
SELECT dateadd(month, datediff(month, 0, AddDate)+0, 0), COUNT(ID) 
FROM @TestTable 
GROUP BY dateadd(month, datediff(month, 0, AddDate)+0, 0) 
-- for each year 
SELECT dateadd(year, datediff(year, 0, AddDate)+0, 0), COUNT(ID) 
FROM @TestTable 
GROUP BY dateadd(year, datediff(year, 0, AddDate)+0, 0) 
相关问题