Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
Solved

# Counting days for the month

Posted on 2011-09-09
Medium Priority
206 Views
Given the following rows

ID       date             active
1        8/1/2011      1
1        8/10/2011    0
1        8/20/2011    1

i want to write a query that will count the number of days id=1 is active

ie

1-10 = 10
20-31 = 12

Total: 22

Allan
0
[X]
###### Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

• Help others & share knowledge
• Earn cash & points

LVL 7

Expert Comment

ID: 36512791
SELECT COUNT(*)
FROM TABLENAME
WHERE ID = 1 AND ACTIVE = 1;
0

Author Comment

ID: 36512857
BusyMama Thanks for the reply, but that wont work your query would only give me 2.

there are only three rows here there isnt a row for every day.

the query need to count that from 8/1 - 8/10 that is was active and then from 8/21 - 8/31 it was also active for a total of 22

Allan
0

LVL 41

Expert Comment

ID: 36513254
try something like this

``````;with cte as (
from (select * from yourtable where active = 1) a
cross outer apply (select id, min([date]) as nextdate from yourtable where active = 0 and id = a.id and [date] > a.[date]) b
), cte2 as (
select id, [date], enddate, datediff(d, [date], enddate) as ndays
from cte
)
select id, sum(ndays)
from cte2
where id = 1
``````
0

LVL 41

Accepted Solution

ID: 36513265
and actually to limit it to a specific month
``````;with cte as (
from (select * from yourtable where active = 1 where [date] between '2011-08-01' and '2011-08-31') a
cross outer apply (select id, min([date]) as nextdate from yourtable where active = 0 and id = a.id and [date] > a.[date]) b
), cte2 as (
select id, [date], enddate, datediff(d, [date], enddate) as ndays
from cte
)
select id, sum(ndays)
from cte2
where id = 1
``````
0

LVL 50

Expert Comment

ID: 36513422
show some proper data...

cross a month boundary... can you have

8/20/2011   1
9/04/2011   0

?
0

Author Comment

ID: 36513670
ralmada thx but this only gives me 9, from 8/1-8/10

I would need to add another row

select 1, '9/1/2011' 0

to my dataset to get the correct value which is not a big deal.
``````; WITH data AS
(
SELECT 1 AS id, '8/1/2011' AS [date], 1 AS active UNION ALL
SELECT 1, '8/10/2011', 0 UNION ALL
SELECT 1, '8/20/2011', 1
), cte as (
select a.id, a.[date], isnull(b.nextdate, dateadd(m, datediff(m, 0, a.[date])+1, 0)-1) as enddate
from (select * from data where active = 1) a
cross apply (select id, min([date]) as nextdate from data where active = 0 and id = a.id and [date] > a.[date] GROUP BY id) b
), cte2 as (
select id, [date], enddate, datediff(d, [date], enddate) as ndays
from cte
)

select id, sum(ndays)
from cte2
where id = 1
GROUP BY id
``````
0

Author Comment

ID: 36513679

this is really only specific to one month.
0

LVL 41

Expert Comment

ID: 36514263
Here's the corrected version to give you the extra day
``````declare @t table (
ID       int,
[date] date,
active int
)

insert @t values(1,        '8/1/2011',      1),
(1,        '8/10/2011',    0),
(1,        '8/20/2011',    1)

select * from @t

;with cte as (
select a.id, a.[date], isnull(b.nextdate, dateadd(m, datediff(m, 0, a.[date])+1, 0)-1) as enddate
from (select * from @t where active = 1 and [date] between '2011-08-01' and '2011-08-31') a
outer apply (select id, min([date]) as nextdate from @t where active = 0 and id = a.id and [date] > a.[date] group by id) b
), cte2 as (
select id, [date], enddate, datediff(d, [date], enddate)+1 as ndays
from cte
)
select id, sum(ndays)
from cte2
where id = 1
group by id
``````
0

## Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Use this article to create a batch file to backup a Microsoft SQL Server database to a Windows folder.  The folder can be on the local hard drive or on a network share.  This batch file will query the SQL server to get the current date & time and wiâ€¦
It is possible to export the data of a SQL Table in SSMS and generate INSERT statements. It's neatly tucked away in the generate scripts option of a database.
In this video, Percona Solution Engineer Dimitri Vanoverbeke discusses why you want to use at least three nodes in a database cluster. To discuss how Percona Consulting can help with your design and architecture needs for your database and infrasâ€¦
Want to learn how to record your desktop screen without having to use an outside camera. Click on this video and learn how to use the cool google extension called "Screencastify"! Step 1: Open a new google tab Step 2: Go to the left hand upper cornâ€¦
###### Suggested Courses
Course of the Month5 days, 22 hours left to enroll