From 63a4f7a3d209c8fb9105c9ed90d2ce8b39662983 Mon Sep 17 00:00:00 2001 From: zhaochangle Date: Tue, 11 Jul 2023 23:00:49 +0800 Subject: [PATCH 1/2] add sec_to_time --- .../function_date_or_datetime_computation.cpp | 2 + .../function_date_or_datetime_computation.h | 23 ++++++++- .../date-time-functions/sec_to_time.md | 48 +++++++++++++++++++ docs/sidebars.json | 1 + .../date-time-functions/sec_to_time.md | 48 +++++++++++++++++++ gensrc/script/doris_builtins_functions.py | 1 + 6 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 docs/en/docs/sql-manual/sql-functions/date-time-functions/sec_to_time.md create mode 100644 docs/zh-CN/docs/sql-manual/sql-functions/date-time-functions/sec_to_time.md diff --git a/be/src/vec/functions/function_date_or_datetime_computation.cpp b/be/src/vec/functions/function_date_or_datetime_computation.cpp index 1f2de986a1edc8..8034d34c195e05 100644 --- a/be/src/vec/functions/function_date_or_datetime_computation.cpp +++ b/be/src/vec/functions/function_date_or_datetime_computation.cpp @@ -123,6 +123,7 @@ using FunctionCurTime = FunctionCurrentDateOrDateTime>; using FunctionUtcTimeStamp = FunctionCurrentDateOrDateTime; using FunctionTimeToSec = FunctionCurrentDateOrDateTime; +using FunctionSecToTime = FunctionCurrentDateOrDateTime; /// @TEMPORARY: for be_exec_version=2 using FunctionToWeekTwoArgsOld = @@ -177,6 +178,7 @@ void register_function_date_time_computation(SimpleFunctionFactory& factory) { factory.register_function(); factory.register_function(); factory.register_function(); + factory.register_function(); // alias factory.register_alias("days_add", "date_add"); diff --git a/be/src/vec/functions/function_date_or_datetime_computation.h b/be/src/vec/functions/function_date_or_datetime_computation.h index 1bc5d37c531553..96a380724679f0 100644 --- a/be/src/vec/functions/function_date_or_datetime_computation.h +++ b/be/src/vec/functions/function_date_or_datetime_computation.h @@ -1071,7 +1071,7 @@ struct TimeToSecImpl { static constexpr auto name = "time_to_sec"; static Status execute(FunctionContext* context, Block& block, const ColumnNumbers& arguments, size_t result, size_t input_rows_count) { - auto res_col = ColumnVector::create(); + auto res_col = ColumnInt32::create(); const auto& [argument_column, arg_is_const] = unpack_if_const(block.get_by_position(arguments[0]).column); const auto& column_data = assert_cast(*argument_column); @@ -1093,6 +1093,27 @@ struct TimeToSecImpl { } }; +struct SecToTimeImpl { + using ReturnType = DataTypeTime; + static constexpr auto name = "sec_to_time"; + static Status execute(FunctionContext* context, Block& block, const ColumnNumbers& arguments, + size_t result, size_t input_rows_count) { + auto res_col = ColumnFloat64::create(); + const auto& [argument_column, arg_const] = + unpack_if_const(block.get_by_position(arguments[0]).column); + const auto& column_data = assert_cast(*argument_column); + const size_t rows = arg_const ? 1 : input_rows_count; + auto& res_data = res_col->get_data(); + res_data.resize(rows); + for (int i = 0; i < rows; ++i) { + res_data[i] = static_cast(column_data.get_element(i)); + } + + block.replace_by_position(result, std::move(res_col)); + return Status::OK(); + } +}; + struct UtcTimestampImpl { using ReturnType = DataTypeDateTime; static constexpr auto name = "utc_timestamp"; diff --git a/docs/en/docs/sql-manual/sql-functions/date-time-functions/sec_to_time.md b/docs/en/docs/sql-manual/sql-functions/date-time-functions/sec_to_time.md new file mode 100644 index 00000000000000..554c79ba0f443f --- /dev/null +++ b/docs/en/docs/sql-manual/sql-functions/date-time-functions/sec_to_time.md @@ -0,0 +1,48 @@ +--- +{ + "title": "sec_to_time", + "language": "en" +} +--- + + + +## sec_to_time +### description +#### Syntax + +`TIME sec_to_time(INT timestamp)` + +The parameter is a timestamp of type INT, and the function returns a time of type TIME. + +### example + +``` +mysql >select sec_to_time(time_to_sec(cast('16:32:18' as time))); ++----------------------------------------------------+ +| sec_to_time(time_to_sec(CAST('16:32:18' AS TIME))) | ++----------------------------------------------------+ +| 16:32:18 | ++----------------------------------------------------+ +1 row in set (0.53 sec) +``` + +### keywords + SEC_TO_TIME diff --git a/docs/sidebars.json b/docs/sidebars.json index fc8323f6898a23..880327ec0ae06c 100644 --- a/docs/sidebars.json +++ b/docs/sidebars.json @@ -345,6 +345,7 @@ "sql-manual/sql-functions/date-time-functions/to_date", "sql-manual/sql-functions/date-time-functions/to_days", "sql-manual/sql-functions/date-time-functions/time_to_sec", + "sql-manual/sql-functions/date-time-functions/sec_to_time", "sql-manual/sql-functions/date-time-functions/extract", "sql-manual/sql-functions/date-time-functions/makedate", "sql-manual/sql-functions/date-time-functions/str_to_date", diff --git a/docs/zh-CN/docs/sql-manual/sql-functions/date-time-functions/sec_to_time.md b/docs/zh-CN/docs/sql-manual/sql-functions/date-time-functions/sec_to_time.md new file mode 100644 index 00000000000000..a80b4fcabf682f --- /dev/null +++ b/docs/zh-CN/docs/sql-manual/sql-functions/date-time-functions/sec_to_time.md @@ -0,0 +1,48 @@ +--- +{ + "title": "sec_to_time", + "language": "zh-CN" +} +--- + + + +## sec_to_time +### description +#### Syntax + +`TIME sec_to_time(INT timestamp)` + +参数为INT类型时间戳,函数返回TIME类型时间。 + +### example + +``` +mysql >select sec_to_time(time_to_sec(cast('16:32:18' as time))); ++----------------------------------------------------+ +| sec_to_time(time_to_sec(CAST('16:32:18' AS TIME))) | ++----------------------------------------------------+ +| 16:32:18 | ++----------------------------------------------------+ +1 row in set (0.53 sec) +``` + +### keywords + SEC_TO_TIME diff --git a/gensrc/script/doris_builtins_functions.py b/gensrc/script/doris_builtins_functions.py index bf34a7cf527307..e52fa4e558c7b2 100644 --- a/gensrc/script/doris_builtins_functions.py +++ b/gensrc/script/doris_builtins_functions.py @@ -996,6 +996,7 @@ [['to_days'], 'INT', ['DATEV2'], ''], [['time_to_sec'], 'INT', ['TIME'], ''], + [['sec_to_time'], 'TIME', ['INT'], ''], [['year'], 'SMALLINT', ['DATETIMEV2'], ''], [['month'], 'TINYINT', ['DATETIMEV2'], ''], From 32fa1ab19138c1f1edb12e98a76839f57170bdb2 Mon Sep 17 00:00:00 2001 From: zhaochangle Date: Thu, 13 Jul 2023 00:10:59 +0800 Subject: [PATCH 2/2] fix --- .../function_date_or_datetime_computation.h | 38 +++++++------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/be/src/vec/functions/function_date_or_datetime_computation.h b/be/src/vec/functions/function_date_or_datetime_computation.h index 96a380724679f0..f91fe643b307b4 100644 --- a/be/src/vec/functions/function_date_or_datetime_computation.h +++ b/be/src/vec/functions/function_date_or_datetime_computation.h @@ -1071,24 +1071,16 @@ struct TimeToSecImpl { static constexpr auto name = "time_to_sec"; static Status execute(FunctionContext* context, Block& block, const ColumnNumbers& arguments, size_t result, size_t input_rows_count) { - auto res_col = ColumnInt32::create(); - const auto& [argument_column, arg_is_const] = - unpack_if_const(block.get_by_position(arguments[0]).column); - const auto& column_data = assert_cast(*argument_column); - if (arg_is_const) { - double time = column_data.get_element(0); - res_col->insert_value(static_cast(time)); - block.replace_by_position(result, - ColumnConst::create(std::move(res_col), input_rows_count)); - } else { - auto& res_data = res_col->get_data(); - res_data.resize(input_rows_count); - for (int i = 0; i < input_rows_count; ++i) { - double time = column_data.get_element(i); - res_data[i] = static_cast(time); - } - block.replace_by_position(result, std::move(res_col)); + auto res_col = ColumnInt32::create(input_rows_count); + const auto& arg_col = block.get_by_position(arguments[0]).column; + const auto& column_data = assert_cast(*arg_col); + + auto& res_data = res_col->get_data(); + for (int i = 0; i < input_rows_count; ++i) { + res_data[i] = static_cast(column_data.get_element(i)); } + block.replace_by_position(result, std::move(res_col)); + return Status::OK(); } }; @@ -1098,14 +1090,12 @@ struct SecToTimeImpl { static constexpr auto name = "sec_to_time"; static Status execute(FunctionContext* context, Block& block, const ColumnNumbers& arguments, size_t result, size_t input_rows_count) { - auto res_col = ColumnFloat64::create(); - const auto& [argument_column, arg_const] = - unpack_if_const(block.get_by_position(arguments[0]).column); - const auto& column_data = assert_cast(*argument_column); - const size_t rows = arg_const ? 1 : input_rows_count; + const auto& arg_col = block.get_by_position(arguments[0]).column; + const auto& column_data = assert_cast(*arg_col); + + auto res_col = ColumnFloat64::create(input_rows_count); auto& res_data = res_col->get_data(); - res_data.resize(rows); - for (int i = 0; i < rows; ++i) { + for (int i = 0; i < input_rows_count; ++i) { res_data[i] = static_cast(column_data.get_element(i)); }