How to find a count of each day between two dates

Posted on 2014-11-20
Medium Priority
Last Modified: 2014-11-20
I am trying to get a count of hotel nights for an upcoming meeting,  I have a table with each persons "Arrival Date" and "Departure Date" and a query with those 2 dates and the "Number of Total Nights" (used DateDiff formula).  How do I find the number of rooms I need for each night?

Arrival Date      Departure Date      Number of Nights
3/9/2014         3/14/2014                          5
3/9/2014         3/13/2014                         4
3/10/2014         3/11/2014                         1

Number of Rooms needed for each night:  (This is the part I cant figure out how to do???)
3/9/2014      3/10/2014      3/11/2014      3/12/2014      3/13/2014
2                      3                      2                      2                      1
Question by:snoopyswimer
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
  • Learn & ask questions
  • 3
  • 3
  • 2
LVL 48

Expert Comment

by:Dale Fye
ID: 40455314
I generally start by creating a table (tbl_Numbers) which contains 1 field (lng_Number) and 10 records, the values 0-9.

I then create a query (qry_Numbers) that generates the numbers 0-99:
SELECT Tens.lng_Number * 10 + Ones.lng_Number as lng_Number
FROM tbl_Numbers as Tens, tbl_Numbers as Ones.

With this query, I can generate a list of 100 consecutive days:

SELECT DateAdd("d", lng_Number, [StartDate]) as MyDate
FROM qry_Numbers
WHERE DateAdd("d", lng_Number, [StartDate]) < [EndDate]

Using this as a subquery, you can include your table and generate the count of records per day.

SELECT sq.MyDate, SUM(iif(T.ArrivalDate <= sq.MyDate AND T.DepartureDate > sq.MyDate, 1, 0)) as RoomCount
SELECT DateAdd("d", lng_Number, [StartDate]) as MyDate
FROM qry_Numbers
WHERE DateAdd("d", lng_Number, [StartDate]) < [EndDate]
) as sq, YourTable as T
GROUP BY sq.MyDate

You could refine that further so that you are not comparing the dates in the MyDate query agains all dates in your other table by filtering the other table first.  Something like:

SELECT sq.MyDate, SUM(iif(AD.ArrivalDate <= sq.MyDate AND AD.DepartureDate > sq.MyDate, 1, 0)) as RoomCount
SELECT DateAdd("d", lng_Number, [StartDate]) as MyDate
FROM qry_Numbers
WHERE DateAdd("d", lng_Number, [StartDate]) < [EndDate]
) as sq, (
WHERE YourTable.ArrivalDate <=[EndDate]
AND yourTable.DepartureDate >= [StartDate]
) as AD
GROUP BY sq.MyDate

Author Comment

ID: 40455559
I guess I should have mentioned that I am not great with coding. ;-)

I am going to try and mess with what you gave me and see if I can make it work.
LVL 26

Accepted Solution

Nick67 earned 2000 total points
ID: 40455707
Each person has a room to themselves?
Code on a form
Option Compare Database
Option Explicit

Private Sub txtDate_AfterUpdate()
Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("Select PersonID from tblStays where arrival <= #" & Me.txtDate & "# and departure >= #" & Me.txtDate & "#;", dbOpenDynaset, dbSeeChanges)
If rs.RecordCount = 0 Then
    Me.txtRooms = 0
    Me.txtRooms = rs.RecordCount
End If

End Sub

Open in new window

Fire up a recordset of stays that a given date falls between arrivals and departures.
The count is the number of rooms required.

Sample attached
What is SQL Server and how does it work?

The purpose of this paper is to provide you background on SQL Server. It’s your self-study guide for learning fundamentals. It includes both the history of SQL and its technical basics. Concepts and definitions will form the solid foundation of your future DBA expertise.


Author Comment

ID: 40455793
Yes, each person has their own room.  That looks like it will work.  I actually have all my data in one table (tbl_main).  Here are the fields in that table: FirstName, LastName, EmpId (unique number), Arrival, & Departure.    Will that form / code work with just one table?
LVL 26

Assisted Solution

Nick67 earned 2000 total points
ID: 40455809
The idea is the same.
Change the line in the sample to
Set rs = CurrentDb.OpenRecordset("Select EmpId from tbl_main where arrival <= #" & Me.txtDate & "# and departure >= #" & Me.txtDate & "#;", dbOpenDynaset, dbSeeChanges)
Should git 'er dun

Author Closing Comment

ID: 40455899
This worked perfectly!
LVL 48

Expert Comment

by:Dale Fye
ID: 40455977
I'm confused.  That only returns the value for a single day, that is not what you asked in your original post.
LVL 26

Expert Comment

ID: 40456031

It's not a far stretch to put multiple boxes onto a form to run it for multiple entered dates.
It's also not a far stretch to turn it into a function that you feed date in, and get # of rooms out.
Or to dummy up a form that figured out the maximum number of days between [arrival] & [departure] and to do the calculation for each day -- that's more complex as you need a dummy table to bind to get sequential numbers -- like you suggested.
Which I could have done for the Asker if requested.

But the question was "How do I find the number of rooms I need for each night"  Singular
I didn't read it as 'How do I find the number of rooms I need for each and every night"  Totality


But then I always think in terms of VBA recordsets as my weapon of choice -- yours is SQL.
I thought about suggesting DCount -- but Domain Aggregates are just evil.


Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

As tax season makes its return, so does the increase in cyber crime and tax refund phishing that comes with it
Access developers frequently have requirements to interact with Excel (import from or output to) in their applications.  You might be able to accomplish this with the TransferSpreadsheet and OutputTo methods, but in this series of articles I will di…
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…
Visualize your data even better in Access queries. Given a date and a value, this lesson shows how to compare that value with the previous value, calculate the difference, and display a circle if the value is the same, an up triangle if it increased…
Suggested Courses

752 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