You've already forked mariadb-columnstore-engine
mirror of
https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
synced 2026-01-06 08:21:10 +03:00
MCOL-1433 Fix several functions for TIME handling
This fixes hex() so that it outputs the hex of the ASCII for the time data to make it aligned with MariaDB. It also fixes the following functions so that they use NOW() as a DATETIME with the input TIME added to it: * weekday() * yearweek() * monthname() * last_day() * year() * weekofyear() * week() * to_days() * quarter() * month() * dayofyear() * dayofweek() * dayofmonth() * day() * date()
This commit is contained in:
@@ -36,180 +36,6 @@ using namespace dataconvert;
|
||||
#include "functor_dtm.h"
|
||||
#include "funchelpers.h"
|
||||
|
||||
namespace
|
||||
{
|
||||
using namespace funcexp;
|
||||
|
||||
int64_t addTime(DateTime& dt1, Time& dt2)
|
||||
{
|
||||
DateTime dt;
|
||||
dt.year = 0;
|
||||
dt.month = 0;
|
||||
dt.day = 0;
|
||||
dt.hour = 0;
|
||||
dt.minute = 0;
|
||||
dt.second = 0;
|
||||
dt.msecond = 0;
|
||||
|
||||
int64_t month, day, hour, min, sec, msec, tmp;
|
||||
msec = (signed)(dt1.msecond + dt2.msecond);
|
||||
dt.msecond = tmp = msec % 1000000;
|
||||
|
||||
if (tmp < 0)
|
||||
{
|
||||
dt.msecond = tmp + 1000000;
|
||||
dt2.second--;
|
||||
}
|
||||
|
||||
sec = (signed)(dt1.second + dt2.second + msec / 1000000);
|
||||
dt.second = tmp = sec % 60;
|
||||
|
||||
if (tmp < 0)
|
||||
{
|
||||
dt.second = tmp + 60;
|
||||
dt2.minute--;
|
||||
}
|
||||
|
||||
min = (signed)(dt1.minute + dt2.minute + sec / 60);
|
||||
dt.minute = tmp = min % 60;
|
||||
|
||||
if (tmp < 0)
|
||||
{
|
||||
dt.minute = tmp + 60;
|
||||
dt2.hour--;
|
||||
}
|
||||
|
||||
hour = (signed)(dt1.hour + dt2.hour + min / 60);
|
||||
|
||||
if ((hour < 0) || (hour > 23))
|
||||
{
|
||||
dt2.day = hour / 24;
|
||||
hour = hour % 24;
|
||||
}
|
||||
|
||||
if (hour < 0)
|
||||
{
|
||||
dt.hour = hour + 24;
|
||||
dt2.day--;
|
||||
}
|
||||
else
|
||||
{
|
||||
dt.hour = hour;
|
||||
}
|
||||
|
||||
day = (signed)(dt1.day + dt2.day);
|
||||
|
||||
|
||||
if (isLeapYear(dt1.year) && dt1.month == 2)
|
||||
day--;
|
||||
|
||||
month = dt1.month;
|
||||
int addyear = 0;
|
||||
|
||||
if (day < 0)
|
||||
{
|
||||
int monthSave = month;
|
||||
|
||||
while (day <= 0)
|
||||
{
|
||||
month = (month == 1 ? 12 : month - 1);
|
||||
|
||||
for (; day <= 0 && month > 0; month--)
|
||||
day += getDaysInMonth(month, dt1.year);
|
||||
|
||||
month++;
|
||||
// month=12;
|
||||
}
|
||||
|
||||
if ( month > monthSave )
|
||||
addyear--;
|
||||
}
|
||||
else
|
||||
{
|
||||
int monthSave = month;
|
||||
|
||||
while (day > getDaysInMonth(month, dt1.year))
|
||||
{
|
||||
for (; day > getDaysInMonth(month, dt1.year) && month <= 12; month++)
|
||||
day -= getDaysInMonth(month, dt1.year);
|
||||
|
||||
if (month > 12)
|
||||
month = 1;
|
||||
}
|
||||
|
||||
if ( month < monthSave )
|
||||
addyear++;
|
||||
}
|
||||
|
||||
dt.day = day;
|
||||
dt.month = month;
|
||||
dt.year = dt1.year + addyear;
|
||||
|
||||
return *(reinterpret_cast<int64_t*>(&dt));
|
||||
}
|
||||
|
||||
int64_t addTime(Time& dt1, Time& dt2)
|
||||
{
|
||||
Time dt;
|
||||
dt.is_neg = false;
|
||||
dt.hour = 0;
|
||||
dt.minute = 0;
|
||||
dt.second = 0;
|
||||
dt.msecond = 0;
|
||||
|
||||
int64_t min, sec, msec, tmp;
|
||||
msec = (signed)(dt1.msecond + dt2.msecond);
|
||||
dt.msecond = tmp = msec % 1000000;
|
||||
|
||||
if (tmp < 0)
|
||||
{
|
||||
dt.msecond = tmp + 1000000;
|
||||
dt2.second--;
|
||||
}
|
||||
|
||||
sec = (signed)(dt1.second + dt2.second + msec / 1000000);
|
||||
dt.second = tmp = sec % 60;
|
||||
|
||||
if (tmp < 0)
|
||||
{
|
||||
dt.second = tmp + 60;
|
||||
dt2.minute--;
|
||||
}
|
||||
|
||||
min = (signed)(dt1.minute + dt2.minute + sec / 60);
|
||||
dt.minute = tmp = min % 60;
|
||||
|
||||
if (tmp < 0)
|
||||
{
|
||||
dt.minute = tmp + 60;
|
||||
dt2.hour--;
|
||||
}
|
||||
|
||||
dt.hour = tmp = (signed)(dt1.hour + dt2.hour + min / 60);
|
||||
|
||||
// Saturation
|
||||
if (tmp > 838)
|
||||
{
|
||||
dt.hour = 838;
|
||||
dt.minute = 59;
|
||||
dt.second = 59;
|
||||
dt.msecond = 999999;
|
||||
}
|
||||
else if (tmp < -838)
|
||||
{
|
||||
dt.is_neg = true;
|
||||
dt.hour = -838;
|
||||
dt.minute = 59;
|
||||
dt.second = 59;
|
||||
dt.msecond = 999999;
|
||||
}
|
||||
|
||||
return *(reinterpret_cast<int64_t*>(&dt));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
namespace funcexp
|
||||
{
|
||||
|
||||
|
||||
Reference in New Issue
Block a user