Solved

How to find a count of each day between two dates

Posted on 2014-11-20
8
191 Views
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?

Ex:
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
0
Comment
Question by:snoopyswimer
  • 3
  • 3
  • 2
8 Comments
 
LVL 47

Expert Comment

by:Dale Fye (Access MVP)
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
FROM (
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
FROM (
SELECT DateAdd("d", lng_Number, [StartDate]) as MyDate
FROM qry_Numbers
WHERE DateAdd("d", lng_Number, [StartDate]) < [EndDate]
) as sq, (
SELECT * FROM YourTable
WHERE YourTable.ArrivalDate <=[EndDate]
AND yourTable.DepartureDate >= [StartDate]
) as AD
GROUP BY sq.MyDate
0
 

Author Comment

by:snoopyswimer
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.
0
 
LVL 26

Accepted Solution

by:
Nick67 earned 500 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
Else
    rs.MoveLast
    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
hotels.mdb
0
Ransomware-A Revenue Bonanza for Service Providers

Ransomware – malware that gets on your customers’ computers, encrypts their data, and extorts a hefty ransom for the decryption keys – is a surging new threat.  The purpose of this eBook is to educate the reader about ransomware attacks.

 

Author Comment

by:snoopyswimer
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?
0
 
LVL 26

Assisted Solution

by:Nick67
Nick67 earned 500 total points
ID: 40455809
Sure.
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
0
 

Author Closing Comment

by:snoopyswimer
ID: 40455899
This worked perfectly!
0
 
LVL 47

Expert Comment

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

Expert Comment

by:Nick67
ID: 40456031
@fyed

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.

Nick67
0

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering 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

Phishing attempts can come in all forms, shapes and sizes. No matter how familiar you think you are with them, always remember to take extra precaution when opening an email with attachments or links.
It’s been over a month into 2017, and there is already a sophisticated Gmail phishing email making it rounds. New techniques and tactics, have given hackers a way to authentically impersonate your contacts.How it Works The attack works by targeti…
In Microsoft Access, learn how to use Dlookup and other domain aggregate functions and one method of specifying a string value within a string. Specify the first argument, which is the expression to be returned: Specify the second argument, which …
Access reports are powerful and flexible. Learn how to create a query and then a grouped report using the wizard. Modify the report design after the wizard is done to make it look better. There will be another video to explain how to put the final p…

839 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