Thanks for answering!

Your solution would be right if I can modify the database (and I have no control on software that populate tables).
Unfortunately I can do only queries on that db; so the due date has to be recalculated every time I want to perform the main report (that use the ending date).
An alternative way is to created a snapshot of main db with the added fields, but the report may contains not so updated information (e.g. if the snapshot is synch one time at day in theory the report may display info older up to a day). This violates the requirements of my boss who wants a very updated data ... :'-|


So the only possible ways are:
* do that via high-level language, like C, Perl, Java; I've done this but is very slow ... especially the client running the code is remote (with respect to DB server) ... so in addition to the load generated by the number of queries there's the load of network communication: (<Send Queries> + <Receive Results>) * N (where N >> 1 in general);
* do that via SQL+UDF; the advantage of this solution is the load of computation is on DB server ... the load due to the network communication a very minimal: <Send Query One Time> + <Receive Result>


When I tried UDF I'm said .... WOW this could be the solution to my problems!!!!
Unfortunaly, I found out there's no way (at least for me) to access to current DBMS thread or connection; i.e.:


SELECT foobar( ... ) FROM ...;

I believed from foobar FUNCTION there would have been a way (through parameters passed by MySQL, like UDF_INIT* initid) to access to current DBMS connection object.
I this is true ... what a pity! .... I hope MySQL staff will think to extend UDF to include this feature unless there're hidden trickly I don't see.


-- Marco


From: [EMAIL PROTECTED]
To: "sguazt sguazt" <[EMAIL PROTECTED]>
CC: mysql@lists.mysql.com,[EMAIL PROTECTED]
Subject: RE: Queries inside UDF
Date: Wed, 16 Mar 2005 15:20:09 -0500

Marco,

I think I understand why you might want the end date of your projects to
be dynamically calculated (assuming that's why you want this calculation
to be a UDF?). You would be able to change a starting date, the project's
duration, or add or delete a holiday and your ending dates would
automatically adjust. However, as you have found out, it is not a simple
calculation to perform.

Based on the starting date and some initial duration, any number of
non-working days (which includes both holidays and weekends) may occur
within that time span. So you adjust your ending date which may now also
include more non-working days, so you repeat  the process until you
achieve the duration you wanted and have accurately accounted for all
non-working days since the startdate of the project.  I think your pseudo
code fits that model of calculating the finishdate rather well.

I agree with your assessment to do the finish date calculation in code,
not SQL. However I disagree with the design choice  to make the finish
date a dynamic value (if that's what you did, sorry if you didn't). You
should only need to compute the finish date's value under the following
conditions:
a) initial record creation
b) if you change the start date
c) if you change the duration
d) if a non-workday was added to or removed from the calendar and that day
fell within the computed time span of the project.

It makes better sense to me to detect one of those 4 conditions and UPDATE
a field that holds the ending date by using your algorithm while
performing one of those actions. That way a query like

SELECT name, startdate, enddate
FROM projects
WHERE startdate <= '2005-07-01'
        AND enddate > '2005-07-01';

doesn't need to compute the value for enddate twice (once for the result
and once for the WHERE test)  for every project just to detect any
projects that will be active on July 1, 2005. In fact, that query may even
be able to use an index if you stored the value in a field while if you
kept it only as a calculated value, that would not be possible.

So... have we answered your original question or did we just go WAAY off
track?

Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine


"sguazt sguazt" <[EMAIL PROTECTED]> wrote on 03/16/2005 01:25:09 PM:

>
>
> >From: [EMAIL PROTECTED]
> >To: "sguazt sguazt" <[EMAIL PROTECTED]>
> >CC: mysql@lists.mysql.com,[EMAIL PROTECTED]
> >Subject: RE: Queries inside UDF
> >Date: Wed, 16 Mar 2005 12:37:59 -0500
> >
> >
> >I can almost follow the logic of your pseudocode. Can you explain
"what"
> >it is you are trying to compute? It seems as though you are looking for
> >(or computing) the ending value to some sort of time span but I just
can't
> >quite understand how you are getting there. I can see that you are
using
> >some kind of varying-width (you change your increment value), sliding
time
> >window (you move your start and stop times) but I just don't understand
> >why you stop when you DO get a result (the else clause of (rs==null))
when
> >you needed results for the previous loops (I think you meant to stop
when
> >you didn't get a result)...  And the significance of the data you
finally
> >found escapes me...
>
> yes you got it ... I wrote an erroneous stopping condition:
>
> The real stopping condition is (as you told me):
>
> if ( ts != null ) {
> }
> else {
>   break; // STOP CONDITION
> }
>
> Well I'm trying to explain what I want to do ...
> I have a starting date of an event (see variable start) and it's virtual

> duration (see variable duration); the word "virtual" will be clearer
later.
> For instance you have a table of research projects with the starting
date
> and their related duration.
> In the simple vanilla world, the due date (see variable stop) would be:
> start + duration (consider start as a UNIX timestamp and duration
expressed
> in seconds).
>
> But in real world you've to take care about a calendar. Each project has
a
> project manager associated.
> Each project manager is assigned a calendar because can follow different

> holydays (in fact project manager for project1 could be American;
project
> manager for project2 could be European; and so on ...)
>
> So for each project you've to calculate the real due date according to
the
> calendar associated to the project manager.
> The calendar I have is a event-based calendar (that is, the calendar has

> associated a series of calendar event representing the holydays).
>
> So the pseudo-code:
>
> int calculateDueDate( projectManager, wTsStart, duration )
> {
>         wTsStop = 0; // Working Day stop timestamp
>         increment = 0; // increment of duration
>
>         // calculate the Working Day stop timestamp according to the
> patching duration
>         while ( true ) do
>                 nwTsStart = 0; // Non-Working Day start timestamp
>                 nwTsStop = 0; // Non-Working Day stop timestamp
>
>                 wTsStop = wTsStart + (duration ­ increment);
>                 // retrieve the intersecting interval for the interval
> [wTsStart, wTsStop]
>                 rs = doQuery(
>                         "SELECT CE.tsstart,CE.tsstop "
>                         + "FROM calendar C INNER JOIN calendarevent CE
ON
> C.id=CE.calendar "
>                         + "WHERE C.owner=" + projectManager + " AND (("
+
> wTsStart + "<=CE.tsstart AND " + wTsStop + ">CE.tsstart) OR (" +
wTsStart +
> ">CE.tsstart AND " + wTsStart + "<CE.tsstop)) "
>                         + "ORDER BY CE.tsstart, CE.tsstop"
>                 );
>                 if ( rs != null ) then
>                         delta = 0; // offset between the start of
intervals
>                         nwTsStart = rs[0]['tsstart'];
>                         nwTsStop = rs[0]['tsstop'];
>                         if ( wTsStart < nwTsStart ) then
>                                 delta += nwTsStart - wTsStart;
>                         endif
>                         increment += delta;
>                         wTsStart = nwTsStop;
>                 else
>                         break;
>                 endif
>         endwhile
>
>         return wTsStop;
> }
>
> the returned value is just the real due date.
> The above code have to be repeated for each project manager:
>
> SELECT ...., calculateDueDate( P.manager, P.startDate, P.duration ) FROM

> project P INNER JOIN ...;
>
> bye!!
>
> -- Marco
>
> >
> >Maybe if I understood the nature of your data better I wouldn't be so
> >confused. And, if you would be so kind, can you explain why you are
> >scrolling through the data with a shifting time window to reach some
kind
> >of non-record (I assume)? Is there no other way to reach the same
> >information? Can you not just use the last record and work from there?
> >
> >It's hard to get help for a complex data issue like yours unless you
give
> >us enough information so that we understand your both your data and
your
> >needs. Any one of us may see a path to your solution that you haven't
> >thought of but we can't do that unless we understand both where you are
> >starting from (your base data structures) and where you need to be (the
> >data you require). It's going to be very hard to confuse all of us. The
> >more information you provide, the more complete the help will be.
> >
> >Shawn Green
> >Database Administrator
> >Unimin Corporation - Spruce Pine
> >
> >
> >
> >
> >
> >
> >
>
> _________________________________________________________________
> Scopri il nuovo MSN Htomail - 10MB di allegati
> http://www.msn.it/hotmail/minisite_10
>

_________________________________________________________________ Scarica gratuitamente MSN Toolbar! http://toolbar.msn.it/


-- MySQL General Mailing List For list archives: http://lists.mysql.com/mysql To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]



Reply via email to