提交 715aa50f 编写于 作者: wmmhello's avatar wmmhello

fix:precision problems in time conversion

上级 408a800e
......@@ -439,6 +439,8 @@ end_:
// ((double)time * factors[fromPrecision][toPrecision]);
//}
// !!!!notice: double lose precison if time is too large, for example: 1626006833631000000*1.0 = double = 1626006833631000064
int64_t convertTimeFromPrecisionToUnit(int64_t time, int32_t fromPrecision, char toUnit) {
assert(fromPrecision == TSDB_TIME_PRECISION_MILLI || fromPrecision == TSDB_TIME_PRECISION_MICRO ||
fromPrecision == TSDB_TIME_PRECISION_NANO);
......@@ -446,29 +448,29 @@ int64_t convertTimeFromPrecisionToUnit(int64_t time, int32_t fromPrecision, char
double tmp = time;
switch (toUnit) {
case 's':{
tmp *= (NANOSECOND_PER_SEC/factors[fromPrecision]); // the result of division is an integer
time *= (NANOSECOND_PER_SEC/factors[fromPrecision]);
tmp /= (NANOSECOND_PER_SEC/factors[fromPrecision]); // the result of division is an integer
time /= (NANOSECOND_PER_SEC/factors[fromPrecision]);
break;
}
case 'm':
tmp *= (NANOSECOND_PER_MINUTE/factors[fromPrecision]); // the result of division is an integer
time *= (NANOSECOND_PER_MINUTE/factors[fromPrecision]);
tmp /= (NANOSECOND_PER_MINUTE/factors[fromPrecision]); // the result of division is an integer
time /= (NANOSECOND_PER_MINUTE/factors[fromPrecision]);
break;
case 'h':
tmp *= (NANOSECOND_PER_HOUR/factors[fromPrecision]); // the result of division is an integer
time *= (NANOSECOND_PER_HOUR/factors[fromPrecision]);
tmp /= (NANOSECOND_PER_HOUR/factors[fromPrecision]); // the result of division is an integer
time /= (NANOSECOND_PER_HOUR/factors[fromPrecision]);
break;
case 'd':
tmp *= (NANOSECOND_PER_DAY/factors[fromPrecision]); // the result of division is an integer
time *= (NANOSECOND_PER_DAY/factors[fromPrecision]);
tmp /= (NANOSECOND_PER_DAY/factors[fromPrecision]); // the result of division is an integer
time /= (NANOSECOND_PER_DAY/factors[fromPrecision]);
break;
case 'w':
tmp *= (NANOSECOND_PER_WEEK/factors[fromPrecision]); // the result of division is an integer
time *= (NANOSECOND_PER_WEEK/factors[fromPrecision]);
tmp /= (NANOSECOND_PER_WEEK/factors[fromPrecision]); // the result of division is an integer
time /= (NANOSECOND_PER_WEEK/factors[fromPrecision]);
break;
case 'a':
tmp *= (NANOSECOND_PER_MSEC/factors[fromPrecision]); // the result of division is an integer
time *= (NANOSECOND_PER_MSEC/factors[fromPrecision]);
tmp /= (NANOSECOND_PER_MSEC/factors[fromPrecision]); // the result of division is an integer
time /= (NANOSECOND_PER_MSEC/factors[fromPrecision]);
break;
case 'u':
// the result of (NANOSECOND_PER_USEC/(double)factors[fromPrecision]) maybe a double
......
......@@ -177,29 +177,7 @@ if $data70 != 1 then
return -1
endi
sql select _wstartts, count(tbcol), _wduration, _wstartts, count(*) from ct3 interval(1n, 1w)
print ===> select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(*) from ct3 interval(1n, 1w)
print ===> rows: $rows
print ===> rows0: $data00 $data01 $data02 $data03 $data04
print ===> rows1: $data10 $data11 $data12 $data13 $data14
print ===> rows2: $data20 $data21 $data22 $data23 $data24
print ===> rows3: $data30 $data31 $data32 $data33 $data34
if $rows != 4 then
return -1
endi
if $data00 != @21-12-08 00:00:00.000@ then
return -1
endi
if $data31 != 1 then
return -1
endi
if $data34 != $data31 then
return -1
endi
if $data02 != 2678400000 then
return -1
endi
sql_error select _wstartts, count(tbcol), _wduration, _wstartts, count(*) from ct3 interval(1n, 1w)
sql_error select _wstartts, count(tbcol), _wduration, _wstartts, count(*) from ct3 interval(1n, 1w) sliding(2w)
sql_error select _wstartts, count(tbcol), _wduration, _wstartts, count(*) from ct3 interval(1n, 1w) sliding(4w)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册