[Gambas-user] datediff problem

Jussi Lahtinen jussi.lahtinen at ...626...
Fri Aug 14 01:32:10 CEST 2015


I think this fixes the problem (in gbx_date.c):

int DATE_diff(VALUE *date1, VALUE *date2, int period)
{
    int64_t diff = 0;
    int sdiff, tmpdiff;
    DATE_SERIAL ds1 = {0};
    DATE_SERIAL ds2 = {0};
    bool neg;

    switch (period)
    {
        case DP_DAY:
        case DP_WEEK:
            diff = date1->_date.date - date2->_date.date;
            sdiff = lsgn(diff);
            tmpdiff = lsgn(date1->_date.time - date2->_date.time);
            if (sdiff != tmpdiff && tmpdiff != 0)
                diff -= sdiff;
            break;

        case DP_MILLISECOND:
        case DP_SECOND:
        case DP_MINUTE:
        case DP_HOUR:
            diff = date1->_date.date - date2->_date.date;
            diff = diff * 86400000 + (date1->_date.time -
date2->_date.time);
            break;

        case DP_MONTH:
        case DP_QUARTER:
        case DP_YEAR:
            ds1 = *DATE_split(date1);
            ds2 = *DATE_split(date2);
            break;

        case DP_WEEKDAY:
            diff = date1->_date.date - date2->_date.date;
            sdiff = lsgn(diff);
            if (sdiff != lsgn(date1->_date.time - date2->_date.time))
                diff -= sdiff;
            ds1 = *DATE_split(date1);
            ds2 = *DATE_split(date2);
            break;

        default:
            THROW(E_ARG);
    }

    switch (period)
    {
        case DP_DAY:
            break;

        case DP_WEEK:
            diff /= 7;
            break;

        case DP_SECOND:
            diff /= 1000;
            break;

        case DP_MINUTE:
            diff /= 60000;
            break;

        case DP_HOUR:
            diff /= 3600000;
            break;

        case DP_WEEKDAY:

            neg = (diff < 0);
            if (neg)
            {
                int swap;
                diff = (-diff);
                swap = ds1.weekday;
                ds1.weekday = ds2.weekday;
                ds2.weekday = swap;
            }

            diff = diff / 7 * 5;

            /* last day is not included ! */
            while (ds2.weekday != ds1.weekday)
            {
                if (ds2.weekday > 0 && ds2.weekday < 6)
                    diff++;
                ds2.weekday++;
                if (ds2.weekday == 7)
                    ds2.weekday = 0;
            }

            if (neg)
                diff = (-diff);

            break;

        case DP_MONTH:
            diff = (ds1.year - ds2.year) * 12 + ds1.month - ds2.month;
            break;

        case DP_QUARTER:
            diff = (ds1.year - ds2.year) * 4 + (ds1.month - ds2.month) / 3;
            break;

        case DP_YEAR:
            diff = ds1.year - ds2.year;
            break;

        case DP_MILLISECOND:
            break;
    }

    if (diff < INT32_MIN || diff > INT32_MAX)
        THROW(E_OVERFLOW);

    return diff;
}


Can someone confirm my fix to the function?


Jussi


On Thu, Aug 13, 2015 at 5:22 PM, Adrien Prokopowicz <
adrien.prokopowicz at ...626...> wrote:

> Le Mon, 10 Aug 2015 13:41:17 +0200, Jussi Lahtinen
> <jussi.lahtinen at ...626...> a écrit:
>
> > Sorry to say, but this doesn't seem to be fixed.
> >
> > ? DateDiff(Now, DateAdd(Now, gb.Day, 2), gb.Day)
> > 1
> >
> >
> > Jussi
> >
> > On Sat, Aug 1, 2015 at 7:16 PM, Benoît Minisini <
> > gambas at ...1...> wrote:
> >
> >> Le 01/08/2015 17:52, Benoît Minisini a écrit :
> >> > Le 01/08/2015 17:33, nando a écrit :
> >> >> Here's an example.
> >> >>
> >> >>    Dim FirstDate as Date
> >> >>
> >> >>    FirstDate = Date(2015, 1, 1, 0, 0, 0, 0)
> >> >>    Print DateDiff(firstdate, Date(2015, 8, 1, 00, 00, 00), gb.day)
> >> 'ok
> >> >>    Print DateDiff(firstdate, Date(2015, 8, 1, 00, 00, 01), gb.day)
> >> 'ok
> >> >>    Print DateDiff(firstdate, Date(2015, 8, 1, 03, 59, 59), gb.day)
> >> 'ok
> >> >>    Print DateDiff(firstdate, Date(2015, 8, 1, 04, 00, 00), gb.day)
> >> >> 'Wrong
> >> >>    Print DateDiff(firstdate, Date(2015, 8, 1, 11, 21, 51), gb.day)
> >> >> 'Wrong
> >> >>
> >> >> 212
> >> >> 212
> >> >> 212
> >> >> 213  <---Wrong  should be 212
> >> >> 213  <---Wrong  should be 212
> >> >>
> >> >> Of course, this is looks like it might be a TimeZone problem.
> >> >> I am in GMT -5 but daylight savings during the summer it is -4
> >> >>
> >> >> Am I correct to say this is not correct operation?
> >> >>
> >> >> -Nando
> >> >>
> >> >>
> >> >
> >> > Argh, a just too late bug! You did that to spoil my holidats? 8-o
> >> >
> >>
> >> OK, I couldn't let you alone. I have updated the Gambas 3.8 source
> >> package with the fix for that bug.
> >>
> >> Regards,
> >>
> >> --
> >> Benoît Minisini
>
> That's weird, but the examples given (both jussi's and nando's) all work
> correctly before Benoît's fix (pre-7212), but not after (post-7212) !
>
> Am I missing something completely obvious, or do you get the same behavior
> ?
>
> Here's my test code :
>
> Dim FirstDate As Date
>
>      FirstDate = Date(2015, 1, 1, 0, 0, 0, 0)
>      Print DateDiff(firstdate, Date(2015, 8, 1, 00, 00, 00), gb.day)
>      Print DateDiff(firstdate, Date(2015, 8, 1, 00, 00, 01), gb.day)
>      Print DateDiff(firstdate, Date(2015, 8, 1, 03, 59, 59), gb.day)
>      Print DateDiff(firstdate, Date(2015, 8, 1, 04, 00, 00), gb.day)
>      Print DateDiff(firstdate, Date(2015, 8, 1, 11, 21, 51), gb.day)
>      Print DateDiff(firstdate, DateAdd(firstdate, GB.Day, 2), GB.Day)
>
> Output (Before 7212) :
>
> 212
> 212
> 212
> 212
> 212
> 2
>
> Output (After 7212) :
>
> 211
> 212
> 212
> 212
> 212
> 1
>
> --
> Adrien Prokopowicz
>
>
> ------------------------------------------------------------------------------
> _______________________________________________
> Gambas-user mailing list
> Gambas-user at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/gambas-user
>



More information about the User mailing list