fix:precision problems in time conversion
This commit is contained in:
parent
408a800e42
commit
715aa50f4d
|
@ -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)
|
||||
|
||||
|
|
Loading…
Reference in New Issue