Solved

Calculate number of days

Posted on 2014-11-24
6
110 Views
Last Modified: 2014-11-25
I have a query that calculates Event start and end dates for people with living status changes.  What I need to do is put them into columns showing first quarters for a year, then by year after that.  

In the attached screen shot, the left side is already done in a query.  The section in yellow is what I need to calculate.  I was thinking of adding a query that would calculate each clients date range column, for example, for the first client there would be a column called 90Date which would contain  dateadd("m",3,#1/7/2014#), 180Date column, etc. .  The second client would have dateadd('m',3,#10/11/13#) and so on.  Then use these calculated dates to calculate the number of days for each event.  But I have a feeling there is a much easier way, I just don't see it right now.

Screen shot of query
0
Comment
Question by:UniqueData
  • 2
  • 2
  • 2
6 Comments
 
LVL 24

Expert Comment

by:chaau
ID: 40463530
All you need to do is just to carry the earliest FromDate for the client on each of the rows. That way it will be very easy to create the columns in the query, or even as a expressions directly in the report. If you do not carry the FromDate you will have to use a sub-query (SELECT MIN(FromDate) From LiveChanges Where ClientId = a.ClientAd) for every row.
If you could show us your original query we can work something out
0
 
LVL 7

Author Comment

by:UniqueData
ID: 40463608
Actually, there are more columns that I didn't do a screen shot of.  There is a column called Date_Opened which is in each row.  So in the first example, the date 1/7/2014 is in the Date_Opened for each record for that client.

So, given that Date_Opened field, what I can't figure out is the formula needed to populate the yellow columns.
0
 
LVL 24

Assisted Solution

by:chaau
chaau earned 250 total points
ID: 40463615
ok, this is easy. To do so in the query use this columns:
SELECT Date_Opened,
.... as FromDate,
.... as ToDate,
Iif(ToDate >DateAdd("m", 3, Date_Opened) , DateDiff("d", ToDate, DateAdd("m", 3, Date_Opened) ), 0) as 3mo,
Iif(ToDate >DateAdd("m", 6, Date_Opened) , DateDiff("d", ToDate, DateAdd("m", 6, Date_Opened) ), 0)  as 6mo,
Iif(ToDate >DateAdd("m", 9, Date_Opened) , DateDiff("d", ToDate, DateAdd("m", 9, Date_Opened) ), 0)  as 9mo,
Iif(ToDate >DateAdd("y", 1, Date_Opened) , DateDiff("d", ToDate, DateAdd("y", 1, Date_Opened) ), 0)  as 1yr,
Iif(ToDate >DateAdd("y", 2, Date_Opened) , DateDiff("d", ToDate, DateAdd("y", 2, Date_Opened) ), 0)  as 2yr,
Iif(ToDate >DateAdd("y", 3, Date_Opened) , DateDiff("d", ToDate, DateAdd("y", 3, Date_Opened) ), 0)  as 3yr
....
From theTable

Open in new window

0
How to improve team productivity

Quip adds documents, spreadsheets, and tasklists to your Slack experience
- Elevate ideas to Quip docs
- Share Quip docs in Slack
- Get notified of changes to your docs
- Available on iOS/Android/Desktop/Web
- Online/Offline

 
LVL 49

Accepted Solution

by:
Gustav Brock earned 250 total points
ID: 40464255
You'll be best off with a custom function as shown below.

Then your query could go like this:

Select
    ClientId,
    Date_Opened,
    FromDate,
    ToDate,
    DaysOfStatus(Date_Opened, FromDate, ToDate, 0, 3) As [0-3 mo],
    DaysOfStatus(Date_Opened, FromDate, ToDate, 3, 3) As [4-6 mo],
    DaysOfStatus(Date_Opened, FromDate, ToDate, 6, 3) As [7-9 mo],
    DaysOfStatus(Date_Opened, FromDate, ToDate, 9, 3) As [10-12 mo],
    DaysOfStatus(Date_Opened, FromDate, ToDate, 12, 12) As [1-2 yr],
    DaysOfStatus(Date_Opened, FromDate, ToDate, 24, 12) As [2-3 yr]
From
    tblYourTable
Public Function DaysOfStatus( _
    ByVal datOpen As Date, _
    ByVal datFrom As Date, _
    ByVal datTo As Date, _
    ByVal intMonthFirst As Integer, _
    ByVal intMonths As Integer) _
    As Variant
    
    Dim datFirst    As Date
    Dim datLast     As Date
    Dim varDays     As Variant
    
    datFirst = DateAdd("m", intMonthFirst, datOpen)
    datLast = DateAdd("m", intMonthFirst + intMonths, datOpen)
    
    If DateDiff("d", datFirst, datFrom) > 0 Then
        datFirst = datFrom
    End If
    If DateDiff("d", datLast, datTo) < 0 Then
        datLast = datTo
    End If
    
    varDays = DateDiff("d", datFirst, datLast)
    If varDays <= 0 Then
        varDays = Null
    End If
    
    DaysOfStatus = varDays
    
End Function

Open in new window

/gustav
0
 
LVL 7

Author Closing Comment

by:UniqueData
ID: 40464917
Worked perfectly.  I went with Gustav's because the function helped keep the query a little cleaner but it looks like chaau's is basically the same thing. :)

Thank you both for your time.
0
 
LVL 49

Expert Comment

by:Gustav Brock
ID: 40464938
You are welcome!

/gustav
0

Featured Post

Get up to 2TB FREE CLOUD per backup license!

An exclusive Black Friday offer just for Expert Exchange audience! Buy any of our top-rated backup solutions & get up to 2TB free cloud per system! Perform local & cloud backup in the same step, and restore instantly—anytime, anywhere. Grab this deal now before it disappears!

Join & Write a Comment

Suggested Solutions

It took me quite some time to sort out all the different properties of combo and list boxes available from Visual Basic at run-time. Not that the documentation is lacking: the help pages are quite thorough and well written. The problem was rather wh…
Overview: This article:       (a) explains one principle method to cross-reference invoice items in Quickbooks®       (b) explores the reasons one might need to cross-reference invoice items       (c) provides a sample process for creating a M…
Using Microsoft Access, learn some simple rules for how to construct tables in a relational database. Split up all multi-value fields into single values: Split up fields that belong to other things into separate tables: Make sure that all record…
In Microsoft Access, when working with VBA, learn some techniques for writing readable and easily maintained code.

747 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

16 Experts available now in Live!

Get 1:1 Help Now