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..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,35 @@ 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(); - 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(); + } +}; + +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) { + 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(); + 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(); } }; 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'], ''],