Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
Home
Discussion GroupsFormsForms ProgrammingQueriesModules / DAO / VBAReports / PrintingMacrosDatabase DesignSecurityConversionImporting / LinkingSQL Server / ADPMultiuser / NetworkingReplicationSetup / ConfigurationDeveloper ToolkitsActiveX ControlsNew UsersGeneral 1General 2
Access DirectoryToolsTutorialsUser Groups
Related Topics
SQL ServerOther DB ProductsMS OfficeMore Topics ...

MS Access Forum / Queries / August 2006

Tip: Looking for answers? Try searching our database.

Date range question

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
William - 15 Aug 2006 22:45 GMT
I have database with medicare patients that needs to determine the length of
stay and number of  patients by month.  The data looks like this:
Pt#    Start dt    End dt
123   1/4/06      3/31/06
456   1/6/06      4/11/06
676   5/1/06      5/10/06

Whenever a patients stay is longer than a month need to count that patients
days in that month.
What the result should be is this:
Month      #Patients    Length of stay
Jan 06           2               52 (days) - both patients days to the  end
of the month
Feb 06          2                56 (days)
Mar 06          2                62 (days)
Apr 06           1                11 (days)
May 06          1                10 (days)

Any suggestions ?
KARL DEWEY - 15 Aug 2006 23:33 GMT
I think this will do it.  I used three queries.

SELECT William.[Pt#], William.[Start dt], William.[End dt],
CVDate(Format(DateAdd("m",[CountNUM],[Start dt]),"yyyy/mm/""01""")) AS [Month
of stay]
FROM William, CountNumber
WHERE (((DateAdd("m",[CountNUM],[Start dt]))<=[End dt]))
ORDER BY William.[Pt#], DateAdd("m",[CountNUM],[Start dt]);

SELECT Q.[Pt#], Q.[Start dt], Q.[End dt], Q.[Month of stay], (SELECT
COUNT(*) FROM  [William-1] Q1
     WHERE Q1.[Pt#] = Q.[Pt#]
       AND Q1.[Month of stay] < Q.[Month of stay])+1 AS [Month]
FROM [William-1] AS Q
ORDER BY Q.[Pt#], Q.[Month of stay];

SELECT [William-2].[Pt#], [William-2].[Start dt], [William-2].[End dt],
[William-2].[Month of stay], [William-2].Month,
IIf([Month]=1,DateDiff("d",[Start dt],IIf([End dt]<DateAdd("m",1,[Month of
stay])-1,[End dt],DateAdd("m",1,[Month of stay])-1)),IIf([End
dt]<DateAdd("m",1,[Month of stay])-1,DateDiff("d",[Month of stay],[End
dt]),DateDiff("d",[Month of stay],DateAdd("m",1,[Month of stay])))) AS [Days
stay]
FROM [William-2];

> I have database with medicare patients that needs to determine the length of
> stay and number of  patients by month.  The data looks like this:
[quoted text clipped - 15 lines]
>
> Any suggestions ?
KARL DEWEY - 15 Aug 2006 23:35 GMT
I forgot to mention that CountNUM is a table containing numbers 0 to your
maximum.

> I have database with medicare patients that needs to determine the length of
> stay and number of  patients by month.  The data looks like this:
[quoted text clipped - 15 lines]
>
> Any suggestions ?
William - 16 Aug 2006 00:04 GMT
Karl,

Thank you for the quick response. I will try that and see what happens.
Again Thank you.

> I forgot to mention that CountNUM is a table containing numbers 0 to your
> maximum.
[quoted text clipped - 18 lines]
> >
> > Any suggestions ?
Dale Fye - 16 Aug 2006 02:49 GMT
William,

Are you counting the day they leave/arrive, it does not look like it.  There
are 31 days in January, so a patient that arrives on January 4 and doesn't
leave until March 31st would be on site for 28 days, not 27.

I've got a slightly different technique than Karl,
1.  Create a new table (I call it tbl_Numbers), with one field [Number]
which is defined as a long integer.  Fill this table with the numbers 1-12
(for the months).

2.  Create a couple of functions.  These will be used in the query to
determine the number of days the patient is in the hospital during a given
month.  These are functions I created a while ago to give me the minimum and
maximum from among a group of values passed to the function.  The nice thing
is that they work just as well for dates as it does for numbers or strings.

Public Function Minimum(ParamArray MyArray() As Variant) As Variant

   Dim intLoop As Integer

   For intLoop = LBound(MyArray) To UBound(MyArray)

       If IsEmpty(Minimum) Then
           Minimum = MyArray(intLoop)
       ElseIf IsNull(MyArray(intLoop)) Then
           'do nothing
       ElseIf MyArray(intLoop) < Minimum Then
           Minimum = MyArray(intLoop)
       End If
   Next

End Function

Public Function Maximum(ParamArray MyArray() As Variant) As Variant

   Dim intLoop As Integer

   For intLoop = LBound(MyArray) To UBound(MyArray)

       If IsEmpty(Maximum) Then
           Maximum = MyArray(intLoop)
       ElseIf IsNull(MyArray(intLoop)) Then
           'do nothing
       ElseIf MyArray(intLoop) > Maximum Then
           Maximum = MyArray(intLoop)
       End If
   Next

End Function

3.  Create the following query.  This query gives you a record for each
month that each patient is present, the patients ID number, and the number
of days they were present during the month.  You will have to play with the
parameters inside the DateDiff, Maximum, and Minimum functions to get the
values you want, which are determined by whether you are counting the start
and end dates of their stay.  Once you have the durations working out the
way you want, then modify the query and group it by the Stay_Month, Count on
the Pt_ID column, and Sum on the Duration column

SELECT tbl_Numbers.Number AS Stay_Month
            , tbl_Patient_Dates.Pt_ID
            ,
DateDiff("d",Maximum([Start_Date],DateSerial(2006,[Number],1)),
Minimum(DateSerial(2006,[Number]+1,1),[End_Date])) AS Duration
FROM tbl_Numbers, tbl_Patient_Dates
WHERE (((tbl_Numbers.Number) Between Month([Start_Date]) And
Month([End_Date]))
    AND ((tbl_Patient_Dates.Start_Date)<DateSerial(2007,1,1))
    AND ((tbl_Patient_Dates.End_Date)>DateSerial(2006,1,0)))
ORDER BY tbl_Numbers.Number;

Hope this helps.

>I have database with medicare patients that needs to determine the length
>of
[quoted text clipped - 18 lines]
>
> Any suggestions ?
William - 16 Aug 2006 14:57 GMT
Dale,

Your right in that we are not counting the day they leave/arrive.  We are
interested in how many days the patient is in for the month.  So, for a
patient that arrives on January 4, were interested in counting the number of
days that patient is in until January 31.  Then, if their staying in
February, how many days in February in this case all 28 days.  Then in March
how many more days until they leave.  And this would be for all patients and
counting the number of days for each.   Your technique is good and I will
have to try that one too.

> William,
>
[quoted text clipped - 92 lines]
> >
> > Any suggestions ?
Dale Fye - 17 Aug 2006 00:50 GMT
William,

If you are not counting the day the arrive or the day they leave, I think
you need to relook at your example. The number of days in April would be
April 1 through April 10 (10 days), and the number in May would be 8 (May
2-May 9). You just need to add a day after [Start_Date] ([Start_Date] + 1)
and potentially subtract a date after the [End_Date] ([End_Date] - 1) in the
Maximum and Minimum functions.

Dale

> Dale,
>
[quoted text clipped - 118 lines]
>> >
>> > Any suggestions ?
ben@goette.org - 17 Aug 2006 19:21 GMT
Please excuse me for busting in, but I believe you are possibly
discussing a similar problem to what I have, and I wanted to ask you
wether you might know how to solve this?

I have a  table with 3 columns,
and about 10'000 lines with price data, like

Date        Price     Min/Max
1.1.95      1.20
1.2.95      1.19
1.3.95      1.17
1.4.95      1.20
etc.

I would like identify those that are the highest (lowest) over a
certain period of time
e.g. date +/- 15 days. and mark them in column Min/Max with either "T"
for the highest or "B" for the lowest.

So, on each date I want to calculate for the preceding 15 days and the
following 15 days, wether this date was the highest/lowest for that
overall period of 31 days.

Also, I need to be able to adjust these +/- n days.

Any idea how this could be done - is some of the code you mentioned in
this thread also suitable for this problem (sorry, I'm rather new to
coding) ?

Once again, please excuse the intrusion.
William - 17 Aug 2006 23:52 GMT
I'm not sure that this is the same problem, but I would try the techniques
here.
My mistake earlier in that we are counting both the day patient entered and
left.
I am having some difficulty with the minimum and maximum functions. In that,
its doing fine for the minimum, but not the maximum.
The query by Karl actually handles the situation perfectly, but takes a very
long time
to run. My situation is that I want to know how many patient days do
patients stay in
a month and how many patients are there.   Thus, in my example
Pt#   Start dt   Stop dt
123   1/4/06     3/1/06
456   1/7/06     4/1/06

The results should look like this:
Month     #pts      #days (#of days by all patients)
Jan 06      2            53
Feb 06     2            56
Mar 06     2             32
Apr 06     1              1

> Please excuse me for busting in, but I believe you are possibly
> discussing a similar problem to what I have, and I wanted to ask you
[quoted text clipped - 26 lines]
>
> Once again, please excuse the intrusion.
Dale Fye - 18 Aug 2006 03:12 GMT
William,

I don't get it, in your previous post, you said you are not counting the
first or last day, then you give a different example than your original one,
and you count both the arrival and departure dates.  Do you or don't you
want to count the first and last day of the patients stay?

If you want to count both of these days, try this (I aliased the table names
to make this a little shorter:

SELECT N.Number AS Stay_Month
                , Count(P.Pt_ID) AS CountOfPt_ID
                ,
Sum(DateDiff("d",Maximum([Start_Date],DateSerial(2006,[Number],1)),Minimum(DateSerial(2006,[Number]+1,1),[End_Date]+1)))
AS Duration
FROM tbl_Numbers AS N, tbl_Patient_Dates AS P
WHERE P.Start_Date<DateSerial(2007,1,1)
    AND P.End_Date>DateSerial(2006,1,0)
    AND N.Number Between Month([Start_Date]) And Month([End_Date])
GROUP BY N.Number
ORDER BY N.Number;

HTH
Dale

> I'm not sure that this is the same problem, but I would try the techniques
> here.
[quoted text clipped - 47 lines]
>>
>> Once again, please excuse the intrusion.
Dale Fye - 18 Aug 2006 03:34 GMT
Ben,

In your case, I think I would create two queries, one to get the minimum and
maximum price within 15 days on either side of the date, a second one to
match this query up with your table to mark the Min/Max column with a B or
T.

BTW, Date is an access reserved word and should never be used as a column
name.  Use something like PriceDate

1. qryPriceDateMinMax:
SELECT PD.PriceDate, PD.Price,
              (SELECT MIN(Price) FROM tbl_Price_Data P
              WHERE PriceDate Between PD.PriceDate - [Duration] and
PD.PriceDate + [Duration]) AS MinPrice,
              (SELECT MAX(Price) FROM tbl_Price_Data P
               WHERE PriceDate Between PD.PriceDate - [Duration] and
PD.PriceDate + [Duration]) AS MaxPrice
FROM tbl_Price_Data AS PD;

2.
SELECT PD.PriceDate,
              PD.Price,
              IIf([PD].[Price]=[qry].[MinPrice],"B",IIf([pd].[price]=[qry].[MaxPrice],"T",""))
AS [Min/Max]
FROM tbl_Price_Data AS PD
INNER JOIN qryPriceDateMinMax AS qry
ON PD.PriceDate = qry.PriceDate
ORDER BY PD.PriceDate;

The [Duration] is a parameter which will allow you to use any time period
for your comparison.

Hope this helps
Dale Fye
Developing Solutions
> Please excuse me for busting in, but I believe you are possibly
> discussing a similar problem to what I have, and I wanted to ask you
[quoted text clipped - 26 lines]
>
> Once again, please excuse the intrusion.
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.