From 715aa50f4d4aaecf9c210ab5ac6d11f6952a1328 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Wed, 18 May 2022 12:03:08 +0800 Subject: [PATCH] fix:precision problems in time conversion --- source/common/src/ttime.c | 26 +++++++++++---------- tests/script/tsim/query/interval-offset.sim | 24 +------------------ 2 files changed, 15 insertions(+), 35 deletions(-) diff --git a/source/common/src/ttime.c b/source/common/src/ttime.c index c121b2d83d..d6332fbbc5 100644 --- a/source/common/src/ttime.c +++ b/source/common/src/ttime.c @@ -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 diff --git a/tests/script/tsim/query/interval-offset.sim b/tests/script/tsim/query/interval-offset.sim index 68860dc2cb..5ce3d9382f 100644 --- a/tests/script/tsim/query/interval-offset.sim +++ b/tests/script/tsim/query/interval-offset.sim @@ -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)