简体   繁体   中英

How to count number of records per day?

I have a table in a with the following structure:

CustID --- DateAdded ---

 396       2012-02-09 
 396       2012-02-09 
 396       2012-02-08 
 396       2012-02-07 
 396       2012-02-07
 396       2012-02-07 
 396       2012-02-06
 396       2012-02-06

I would like to know how I can count the number of records per day, for the last 7 days in SQL and then return this as an integer.

At present I have the following SQL query written:

SELECT * 
  FROM Responses
 WHERE DateAdded >= dateadd(day, datediff(day, 0, GetDate()) - 7, 0)

RETURN

However this only returns all entries for the past 7 days. How can I count the records per day for the last 7 days?

select DateAdded, count(CustID)
from Responses
WHERE DateAdded >=dateadd(day,datediff(day,0,GetDate())- 7,0)
GROUP BY DateAdded
select DateAdded, count(CustID)
from tbl
group by DateAdded

about 7-days interval it's DB-depending question

This one is like the answer above which uses the MySql DATE_FORMAT() function. I also selected just one specific week in Jan.

SELECT 
    DatePart(day, DateAdded) AS date, 
    COUNT(entryhash) AS count 
FROM Responses 
    where DateAdded > '2020-01-25' and DateAdded < '2020-02-01' 
GROUP BY 
    DatePart(day, DateAdded )
SELECT DateAdded, COUNT(1) AS NUMBERADDBYDAY
FROM Responses
WHERE DateAdded >= dateadd(day,datediff(day,0,GetDate())- 7,0)
GROUP BY DateAdded

You could also try this:

SELECT DISTINCT (DATE(dateadded)) AS unique_date, COUNT(*) AS amount
FROM table
GROUP BY unique_date
ORDER BY unique_date ASC

Unfortunately the best answer here IMO is a comment by @Profex on an incorrect answer , but the solution I went with is

SELECT FORMAT(DateAdded, 'yyyy-MM-dd'), count(CustID)
FROM Responses
WHERE DateAdded >= dateadd(day,datediff(day,0,GetDate())- 7,0)
GROUP BY FORMAT(DateAdded, 'yyyy-MM-dd')
ORDER BY FORMAT(DateAdded, 'yyyy-MM-dd')

Note that I haven't tested this SQL since I don't have the OP's DB , but this approach works well in my scenario where the date is stored to the second

The important part here is using the FORMAT(DateAdded, 'yyyy-MM-dd') method to drop the time without losing the year and month , as would happen if you used DATEPART(day, DateAdded)

When a day among last 7 days, has no record means, the following code will list out that day with count as zero.

DECLARE @startDate DATE = GETDATE() - 6,
        @endDate DATE = GETDATE();

DECLARE @daysTable TABLE
(
OrderDate date
)

DECLARE @daysOrderTable TABLE
(
OrderDate date,
OrderCount int
)

Insert into @daysTable
SELECT TOP (DATEDIFF(DAY, @startDate, @endDate) + 1)
        Date = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @startDate)
FROM    sys.all_objects a
        CROSS JOIN sys.all_objects b;


Insert into @daysOrderTable
select OrderDate, ISNULL((SELECT COUNT(*) AS OdrCount
                            FROM [dbo].[MyOrderTable] odr
                            WHERE CAST(odr.[CreatedDate] as date) = dt.OrderDate
                            group by CAST(odr.[CreatedDate] as date)
                        ), 0) AS OrderCount from @daysTable dt

select * from @daysOrderTable

RESULT

OrderDate OrderCount

2022-11-22 42

2022-11-23 6

2022-11-24 34

2022-11-25 0

2022-11-26 28

2022-11-27 0

2022-11-28 22

select DATE_FORMAT(DateAdded, '%Y-%m-%d'), count(CustID) from Responses group by DATE_FORMAT(DateAdded, '%Y-%m-%d');

SELECT count(*), dateadded FROM Responses
WHERE DateAdded >=dateadd(day,datediff(day,0,GetDate())- 7,0)
group by dateadded

RETURN

This will give you a count of records for each dateadded value. Don't make the mistake of adding more columns to the select, expecting to get just one count per day. The group by clause will give you a row for every unique instance of the columns listed.

select DateAdded, count(DateAdded) as num_records
from your_table
WHERE DateAdded >=dateadd(day,datediff(day,0,GetDate())- 7,0)
group by DateAdded
order by DateAdded

如果您的时间戳包括时间,而不仅仅是日期,请使用:

SELECT DATE_FORMAT('timestamp', '%Y-%m-%d') AS date, COUNT(id) AS count FROM table GROUP BY DATE_FORMAT('timestamp', '%Y-%m-%d')

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM