未验证 提交 adf42cad 编写于 作者: S shenglian-zhou 提交者: GitHub

Merge pull request #10818 from taosdata/feature/TD-13970-2.4

[TD-13970]<feature>: timestamp format shortcut
......@@ -83,26 +83,26 @@ void deltaToUtcInitOnce() {
static int64_t parseFraction(char* str, char** end, int32_t timePrec);
static int32_t parseTimeWithTz(char* timestr, int64_t* time, int32_t timePrec, char delim);
static int32_t parseLocaltime(char* timestr, int64_t* time, int32_t timePrec);
static int32_t parseLocaltimeWithDst(char* timestr, int64_t* time, int32_t timePrec);
static int32_t parseLocaltime(char* timestr, int64_t* time, int32_t timePrec, char delim, bool withDST);
static char* forwardToTimeStringEnd(char* str);
static bool checkTzPresent(char *str, int32_t len);
static int32_t (*parseLocaltimeFp[]) (char* timestr, int64_t* time, int32_t timePrec) = {
parseLocaltime,
parseLocaltimeWithDst
};
int32_t taosGetTimestampSec() { return (int32_t)time(NULL); }
int32_t taosParseTime(char* timestr, int64_t* time, int32_t len, int32_t timePrec, int8_t day_light) {
/* parse datatime string in with tz */
if (strnchr(timestr, 'T', len, false) != NULL) {
if (checkTzPresent(timestr, len)) {
return parseTimeWithTz(timestr, time, timePrec, 'T');
} else if (checkTzPresent(timestr, len)) {
} else {
return parseLocaltime(timestr, time, timePrec, 'T', day_light);
}
} else {
if (checkTzPresent(timestr, len)) {
return parseTimeWithTz(timestr, time, timePrec, 0);
} else {
return (*parseLocaltimeFp[day_light])(timestr, time, timePrec);
return parseLocaltime(timestr, time, timePrec, 0, day_light);
}
}
}
......@@ -316,14 +316,21 @@ int32_t parseTimeWithTz(char* timestr, int64_t* time, int32_t timePrec, char del
return 0;
}
int32_t parseLocaltime(char* timestr, int64_t* time, int32_t timePrec) {
int32_t parseLocaltime(char* timestr, int64_t* time, int32_t timePrec, char delim, bool withDST) {
*time = 0;
struct tm tm = {0};
if (withDST) {
tm.tm_isdst = -1;
}
char* str = strptime(timestr, "%Y-%m-%d %H:%M:%S", &tm);
if (str == NULL) {
//if parse failed, try "%Y-%m-%d" format
str = strptime(timestr, "%Y-%m-%d", &tm);
if (str == NULL) {
return -1;
}
}
#ifdef _MSC_VER
#if _MSC_VER >= 1900
......@@ -331,36 +338,13 @@ int32_t parseLocaltime(char* timestr, int64_t* time, int32_t timePrec) {
#endif
#endif
int64_t seconds = user_mktime64(tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, timezone);
int64_t fraction = 0;
if (*str == '.') {
/* parse the second fraction part */
if ((fraction = parseFraction(str + 1, &str, timePrec)) < 0) {
return -1;
}
}
int64_t factor = (timePrec == TSDB_TIME_PRECISION_MILLI) ? 1000 :
(timePrec == TSDB_TIME_PRECISION_MICRO ? 1000000 : 1000000000);
*time = factor * seconds + fraction;
return 0;
}
int32_t parseLocaltimeWithDst(char* timestr, int64_t* time, int32_t timePrec) {
*time = 0;
struct tm tm = {0};
tm.tm_isdst = -1;
char* str = strptime(timestr, "%Y-%m-%d %H:%M:%S", &tm);
if (str == NULL) {
return -1;
}
int64_t seconds;
if (!withDST) {
seconds = user_mktime64(tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, timezone);
} else {
/* mktime will be affected by TZ, set by using taos_options */
int64_t seconds = mktime(&tm);
seconds = mktime(&tm);
}
int64_t fraction = 0;
......@@ -374,6 +358,7 @@ int32_t parseLocaltimeWithDst(char* timestr, int64_t* time, int32_t timePrec) {
int64_t factor = (timePrec == TSDB_TIME_PRECISION_MILLI) ? 1000 :
(timePrec == TSDB_TIME_PRECISION_MICRO ? 1000000 : 1000000000);
*time = factor * seconds + fraction;
return 0;
}
......
###################################################################
# Copyright (c) 2021 by TAOS Technologies, Inc.
# All rights reserved.
#
# This file is proprietary and confidential to TAOS Technologies.
# No part of this file may be reproduced, stored, transmitted,
# disclosed or used in any form or by any means other than as
# expressly provided by the written permission from Jianhui Tao
#
###################################################################
# -*- coding: utf-8 -*-
import sys
from util.log import *
from util.cases import *
from util.sql import *
class TDTestCase:
def caseDescription(self):
'''
case1<ganlin zhao>: [TD-13970] timestamp format shortcut
'''
return
def init(self, conn, logSql):
tdLog.debug("start to execute %s" % __file__)
tdSql.init(conn.cursor(), logSql)
self._conn = conn
def run(self):
print("running {}".format(__file__))
tdSql.execute("drop database if exists db")
tdSql.execute("create database if not exists db")
tdSql.execute('use db')
tdSql.execute('create table tb(ts timestamp, c0 int)')
tdSql.execute('create stable stb(ts timestamp , c0 int) tags (t0 timestamp)')
#INSERT
tdSql.execute('insert into tb values ("2020-02-02", 1);')
tdSql.query('select ts from tb');
tdSql.checkRows(1)
res = tdSql.getData(0, 0)
tdSql.checkEqual(str(res), "2020-02-02 00:00:00")
tdSql.execute('insert into ctb using stb tags("2020-02-02") values ("2020-02-02", 1)')
tdSql.query('select ts,t0 from ctb');
tdSql.checkRows(1)
res = tdSql.getData(0, 0)
tdSql.checkEqual(str(res), "2020-02-02 00:00:00")
res = tdSql.getData(0, 1)
tdSql.checkEqual(str(res), "2020-02-02 00:00:00")
tdSql.query('select ts,t0 from stb');
tdSql.checkRows(1)
res = tdSql.getData(0, 0)
tdSql.checkEqual(str(res), "2020-02-02 00:00:00")
res = tdSql.getData(0, 1)
tdSql.checkEqual(str(res), "2020-02-02 00:00:00")
#SELECT WHERE
tdSql.query('select ts from tb where ts = "2020-02-02"')
tdSql.checkRows(1)
res = tdSql.getData(0, 0)
tdSql.checkEqual(str(res), "2020-02-02 00:00:00")
tdSql.query('select ts from ctb where ts <= "2020-02-02"')
tdSql.checkRows(1)
res = tdSql.getData(0, 0)
tdSql.checkEqual(str(res), "2020-02-02 00:00:00")
tdSql.query('select ts from stb where ts >= "2020-02-02"')
tdSql.checkRows(1)
res = tdSql.getData(0, 0)
tdSql.checkEqual(str(res), "2020-02-02 00:00:00")
#CREATE TAG
tdSql.execute('create table ctb1 using stb tags("2020-02-02")')
tdSql.query('select t0 from ctb1');
tdSql.checkRows(1)
res = tdSql.getData(0, 0)
tdSql.checkEqual(str(res), "2020-02-02 00:00:00")
tdSql.execute('drop database db')
def stop(self):
tdSql.close()
tdLog.success("%s successfully executed" % __file__)
tdCases.addWindows(__file__, TDTestCase())
tdCases.addLinux(__file__, TDTestCase())
......@@ -744,5 +744,6 @@
3,,pytest,python3 ./test.py -f query/queryNcharNull.py
3,,develop-test,python3 ./test.py -f 2-query/ts_hidden_column.py
3,,develop-test,python3 ./test.py -f 1-insert/uppercase_in_stmt.py
3,,develop-test,python3 ./test.py -f 2-query/ts_shortcut.py
8,,pytest,python3 test.py -f update/update2.py
4,,pytest,python3 test.py -f insert/line_insert.py
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册