我今天从这里获得了解决问题的良好方向,但我一直试图遵循这个方向。
我想使用我的日期字段检索过去30天内表格中所有行的计数。我使用“now()”填充这些字段,格式为“2009-03-04 14:58:01”。
我希望不在我的查询中指定日期,并且查询只是通用的,并计算相对于今天的计数。我希望通过考虑不同月份的不同天数,我也可以准确地做到这一点。
如何使用只是SQL 来获取此数量?然后我可以将结果集用作数组并使用PHP解析它。
答案 0 :(得分:7)
昨天插入的记录数:
select count(*) from mytable where date(myfield)=date(date_sub(now(),interval 1 day));
今年:
select count(*) from mytable where year(myfield)=year(now());
等等......
答案 1 :(得分:2)
答案 2 :(得分: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上使用HAVING。使用DATE_SUB计算相对于当前的日期。
答案 3 :(得分:0)
查看DATEDIFF ...我不确定mysql的确切语法,但最终应该类似于:
select * from Table WHERE datediff(StartDate, Today) < DaySpan
答案 4 :(得分: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)