提交 518caac6 编写于 作者: G Ganlin Zhao

[TD-11220]<feature>(query): time related functions

上级 9cef33d6
...@@ -2007,86 +2007,100 @@ void vectorTimeFunc(int16_t functionId, tExprOperandInfo *pInputs, int32_t numIn ...@@ -2007,86 +2007,100 @@ void vectorTimeFunc(int16_t functionId, tExprOperandInfo *pInputs, int32_t numIn
assert(pInputs[1].type == TSDB_DATA_TYPE_TIMESTAMP); assert(pInputs[1].type == TSDB_DATA_TYPE_TIMESTAMP);
assert(pInputs[2].type == TSDB_DATA_TYPE_BIGINT); assert(pInputs[2].type == TSDB_DATA_TYPE_BIGINT);
int64_t timeUnit, timePrec; int64_t timeUnit, timePrec, timeVal = 0;
GET_TYPED_DATA(timeUnit, int64_t, pInputs[1].type, inputData[1]); GET_TYPED_DATA(timeUnit, int64_t, pInputs[1].type, inputData[1]);
GET_TYPED_DATA(timePrec, int64_t, pInputs[2].type, inputData[2]); GET_TYPED_DATA(timePrec, int64_t, pInputs[2].type, inputData[2]);
if (pInputs[0].type == TSDB_DATA_TYPE_BINARY || if (pInputs[0].type == TSDB_DATA_TYPE_BINARY ||
pInputs[0].type == TSDB_DATA_TYPE_NCHAR) { pInputs[0].type == TSDB_DATA_TYPE_NCHAR) { /* datetime format strings */
int64_t timeVal = 0;
taosParseTime((char *)varDataVal(inputData[0]), &timeVal, pInputs[0].bytes, timePrec, 0); taosParseTime((char *)varDataVal(inputData[0]), &timeVal, pInputs[0].bytes, timePrec, 0);
} else if (pInputs[0].type == TSDB_DATA_TYPE_BIGINT ||
pInputs[0].type == TSDB_DATA_TYPE_TIMESTAMP) { /* unix timestamp or ts column*/
GET_TYPED_DATA(timeVal, int64_t, pInputs[0].type, inputData[0]);
}
char buf[20] = {0}; char buf[20] = {0};
NUM_TO_STRING(TSDB_DATA_TYPE_BIGINT, &timeVal, sizeof(buf), buf); NUM_TO_STRING(TSDB_DATA_TYPE_BIGINT, &timeVal, sizeof(buf), buf);
int32_t tsDigits = strlen(buf); int32_t tsDigits = strlen(buf);
switch (timeUnit) { int64_t factor = (timePrec == TSDB_TIME_PRECISION_MILLI) ? 1000 :
case 1: { /* 1a */ (timePrec == TSDB_TIME_PRECISION_MICRO ? 1000000 : 1000000000);
if (tsDigits == TSDB_TIME_PRECISION_MILLI_DIGITS) { switch (timeUnit) {
timeVal = timeVal; case 1: { /* 1a */
} else if (tsDigits == TSDB_TIME_PRECISION_MICRO_DIGITS) { if (tsDigits == TSDB_TIME_PRECISION_MILLI_DIGITS) {
timeVal = timeVal / (1000 * 1000) * (1000 * 1000); timeVal = timeVal;
} else if (tsDigits == TSDB_TIME_PRECISION_NANO_DIGITS) { } else if (tsDigits == TSDB_TIME_PRECISION_MICRO_DIGITS) {
timeVal = timeVal / (1000 * 1000 * 1000) * (1000 * 1000 * 1000); timeVal = timeVal / (1000 * 1000) * (1000 * 1000);
} else { } else if (tsDigits == TSDB_TIME_PRECISION_NANO_DIGITS) {
assert(0); timeVal = timeVal / (1000 * 1000 * 1000) * (1000 * 1000 * 1000);
} } else if (tsDigits <= TSDB_TIME_PRECISION_SEC_DIGITS){
break; timeVal = timeVal * factor;
} } else {
case 1000: { /* 1s */ assert(0);
if (tsDigits == TSDB_TIME_PRECISION_MILLI_DIGITS) {
timeVal = timeVal / 1000 * 1000;
} else if (tsDigits == TSDB_TIME_PRECISION_MICRO_DIGITS) {
timeVal = timeVal / (1000 * 1000) * (1000 * 1000);
} else if (tsDigits == TSDB_TIME_PRECISION_NANO_DIGITS) {
timeVal = timeVal / (1000 * 1000 * 1000) * (1000 * 1000 * 1000);
} else {
assert(0);
}
break;
} }
case 60000: { /* 1m */ break;
if (tsDigits == TSDB_TIME_PRECISION_MILLI_DIGITS) { }
timeVal = timeVal / 1000 / 60 * 60 * 1000; case 1000: { /* 1s */
} else if (tsDigits == TSDB_TIME_PRECISION_MICRO_DIGITS) { if (tsDigits == TSDB_TIME_PRECISION_MILLI_DIGITS) {
timeVal = timeVal / (1000 * 1000) / 60 * 60 * (1000 * 1000); timeVal = timeVal / 1000 * 1000;
} else if (tsDigits == TSDB_TIME_PRECISION_NANO_DIGITS) { } else if (tsDigits == TSDB_TIME_PRECISION_MICRO_DIGITS) {
timeVal = timeVal / (1000 * 1000 * 1000) / 60 * 60 * (1000 * 1000 * 1000); timeVal = timeVal / (1000 * 1000) * (1000 * 1000);
} else { } else if (tsDigits == TSDB_TIME_PRECISION_NANO_DIGITS) {
assert(0); timeVal = timeVal / (1000 * 1000 * 1000) * (1000 * 1000 * 1000);
} } else if (tsDigits <= TSDB_TIME_PRECISION_SEC_DIGITS) {
break; timeVal = timeVal * factor;
} else {
assert(0);
} }
case 3600000: { /* 1h */ break;
if (tsDigits == TSDB_TIME_PRECISION_MILLI_DIGITS) { }
timeVal = timeVal / 1000 / 3600 * 3600 * 1000; case 60000: { /* 1m */
} else if (tsDigits == TSDB_TIME_PRECISION_MICRO_DIGITS) { if (tsDigits == TSDB_TIME_PRECISION_MILLI_DIGITS) {
timeVal = timeVal / (1000 * 1000) / 3600 * 3600 * (1000 * 1000); timeVal = timeVal / 1000 / 60 * 60 * 1000;
} else if (tsDigits == TSDB_TIME_PRECISION_NANO_DIGITS) { } else if (tsDigits == TSDB_TIME_PRECISION_MICRO_DIGITS) {
timeVal = timeVal / (1000 * 1000 * 1000) / 3600 * 3600 * (1000 * 1000 * 1000); timeVal = timeVal / (1000 * 1000) / 60 * 60 * (1000 * 1000);
} else { } else if (tsDigits == TSDB_TIME_PRECISION_NANO_DIGITS) {
assert(0); timeVal = timeVal / (1000 * 1000 * 1000) / 60 * 60 * (1000 * 1000 * 1000);
} } else if (tsDigits <= TSDB_TIME_PRECISION_SEC_DIGITS) {
break; timeVal = timeVal * factor / factor / 60 * 60 * factor;
} else {
assert(0);
} }
case 86400000: { /* 1d */ break;
if (tsDigits == TSDB_TIME_PRECISION_MILLI_DIGITS) { }
timeVal = timeVal / 1000 / 86400 * 86400 * 1000; case 3600000: { /* 1h */
} else if (tsDigits == TSDB_TIME_PRECISION_MICRO_DIGITS) { if (tsDigits == TSDB_TIME_PRECISION_MILLI_DIGITS) {
timeVal = timeVal / (1000 * 1000) / 86400 * 86400 * (1000 * 1000); timeVal = timeVal / 1000 / 3600 * 3600 * 1000;
} else if (tsDigits == TSDB_TIME_PRECISION_NANO_DIGITS) { } else if (tsDigits == TSDB_TIME_PRECISION_MICRO_DIGITS) {
timeVal = timeVal / (1000 * 1000 * 1000) / 86400 * 86400 * (1000 * 1000 * 1000); timeVal = timeVal / (1000 * 1000) / 3600 * 3600 * (1000 * 1000);
} else { } else if (tsDigits == TSDB_TIME_PRECISION_NANO_DIGITS) {
assert(0); timeVal = timeVal / (1000 * 1000 * 1000) / 3600 * 3600 * (1000 * 1000 * 1000);
} } else if (tsDigits <= TSDB_TIME_PRECISION_SEC_DIGITS) {
break; timeVal = timeVal * factor / factor / 3600 * 3600 * factor;
} else {
assert(0);
} }
default: { break;
timeVal = 0; }
break; case 86400000: { /* 1d */
if (tsDigits == TSDB_TIME_PRECISION_MILLI_DIGITS) {
timeVal = timeVal / 1000 / 86400 * 86400 * 1000;
} else if (tsDigits == TSDB_TIME_PRECISION_MICRO_DIGITS) {
timeVal = timeVal / (1000 * 1000) / 86400 * 86400 * (1000 * 1000);
} else if (tsDigits == TSDB_TIME_PRECISION_NANO_DIGITS) {
timeVal = timeVal / (1000 * 1000 * 1000) / 86400 * 86400 * (1000 * 1000 * 1000);
} else if (tsDigits <= TSDB_TIME_PRECISION_SEC_DIGITS) {
timeVal = timeVal * factor / factor / 86400* 86400 * factor;
} else {
assert(0);
} }
break;
}
default: {
timeVal = 0;
break;
} }
SET_TYPED_DATA(outputData, pOutput->type, timeVal);
} }
SET_TYPED_DATA(outputData, pOutput->type, timeVal);
break; break;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册