Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

How to calculate no. of days in an year in particular time period in sql server

Below is a sample of medical insurance details of members in an organization. And we have to find out no. of days each member is insured in particular year.
date format for below data is mm-dd-yyyy

SELECT \* FROM MED_INSURANCE

INSERT INTO MED_INSURANCE VALUES

('M1','1-1-2017','11-20-2017')
,('M1','12-31-2017','02-01-2018')
,('M1','02-15-2018','04-30-2018')
,('M1','06-10-2018','12-31-2018')
,('M2','1-1-2017 ','11-20-2017')
,('M2','12-31-2017','02-01-2018')
,('M3','02-15-2018','04-30-2018')
,('M3','06-10-2018','12-31-2018')
,('M4','1-1-2017','11-20-2017')
,('M4','12-31-2017','02-01-2018')
,('M5','02-15-2018','04-30-2018')
,('M5','06-10-2018','12-31-2018')
,('M6','01-01-2017','12-31-2019')
,('M7','12-31-2017','12-30-2018')
,('M8','1-1-2020','12-31-2020')
,('M9','06-30-2018','01-31-2020')

Output should be something like

memberid        no_of_days_insured_in_2018
m1                      309
.
.
.
.
m7                      363

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

>Solution :

If this is for a specific year, as you imply, then you can DATEDIFF with some CASE expressions:

SELECT YD.ID,
       SUM(DATEDIFF(DAY,
                    CASE WHEN YD.StartDate < '20180101' THEN '20180101'
                         WHEN YD.StartDate >= '20190101' THEN NULL
                         ELSE YD.StartDate
                    END,
                    CASE WHEN YD.EndDate < '20180101' THEN NULL
                         WHEN YD.EndDate >= '20190101' THEN '20181231'
                         ELSE YD.EndDate
                    END) + 1) AS DaysIn2018
FROM (VALUES ('M1', '1-1-2017', '11-20-2017'),
             ('M1', '12-31-2017', '02-01-2018'),
             ('M1', '02-15-2018', '04-30-2018'),
             ('M1', '06-10-2018', '12-31-2018'),
             ('M2', '1-1-2017 ', '11-20-2017'),
             ('M2', '12-31-2017', '02-01-2018'),
             ('M3', '02-15-2018', '04-30-2018'),
             ('M3', '06-10-2018', '12-31-2018'),
             ('M4', '1-1-2017', '11-20-2017'),
             ('M4', '12-31-2017', '02-01-2018'),
             ('M5', '02-15-2018', '04-30-2018'),
             ('M5', '06-10-2018', '12-31-2018'),
             ('M6', '01-01-2017', '12-31-2019'),
             ('M7', '12-31-2017', '12-30-2018'),
             ('M8', '1-1-2020', '12-31-2020'),
             ('M9', '06-30-2018', '01-31-2020')) V (ID, StartDate, EndDate)
     CROSS APPLY(VALUES(V.ID, CONVERT(date,StartDate,101), CONVERT(date,V.EndDate,101)))YD(ID, StartDate, EndDate)
GROUP BY YD.ID;
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading