[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