This is an automated email from the ASF dual-hosted git repository. kxiao pushed a commit to branch branch-2.0 in repository https://gitbox.apache.org/repos/asf/doris.git
commit e94cf0c9647af0b472fac4e35166c74ce47f7541 Author: zclllyybb <[email protected]> AuthorDate: Wed Jul 19 01:09:48 2023 +0800 [feature](function) support time_to_sec (#21722) 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) mysql [test]>select sec_to_time(59538); +--------------------+ | sec_to_time(59538) | +--------------------+ | 16:32:18 | +--------------------+ 1 row in set (0.03 sec) --- .../function_date_or_datetime_computation.cpp | 2 + .../function_date_or_datetime_computation.h | 45 ++++++++++++-------- .../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, 128 insertions(+), 17 deletions(-) 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 1f2de986a1..8034d34c19 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<CurrentTimeImpl<CurTimeFun using FunctionCurrentTime = FunctionCurrentDateOrDateTime<CurrentTimeImpl<CurrentTimeFunctionName>>; using FunctionUtcTimeStamp = FunctionCurrentDateOrDateTime<UtcTimestampImpl>; using FunctionTimeToSec = FunctionCurrentDateOrDateTime<TimeToSecImpl>; +using FunctionSecToTime = FunctionCurrentDateOrDateTime<SecToTimeImpl>; /// @TEMPORARY: for be_exec_version=2 using FunctionToWeekTwoArgsOld = @@ -177,6 +178,7 @@ void register_function_date_time_computation(SimpleFunctionFactory& factory) { factory.register_function<FunctionCurrentTime>(); factory.register_function<FunctionUtcTimeStamp>(); factory.register_function<FunctionTimeToSec>(); + factory.register_function<FunctionSecToTime>(); // 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 e31d8f64c6..c53eefd36c 100644 --- a/be/src/vec/functions/function_date_or_datetime_computation.h +++ b/be/src/vec/functions/function_date_or_datetime_computation.h @@ -1032,24 +1032,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<Int32>::create(); - const auto& [argument_column, arg_is_const] = - unpack_if_const(block.get_by_position(arguments[0]).column); - const auto& column_data = assert_cast<const ColumnFloat64&>(*argument_column); - if (arg_is_const) { - double time = column_data.get_element(0); - res_col->insert_value(static_cast<int>(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<int>(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<const ColumnFloat64&>(*arg_col); + + auto& res_data = res_col->get_data(); + for (int i = 0; i < input_rows_count; ++i) { + res_data[i] = static_cast<int>(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<const ColumnInt32&>(*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<double>(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 0000000000..554c79ba0f --- /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" +} +--- + +<!-- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +--> + +## 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 26fc605142..52757c8f8d 100644 --- a/docs/sidebars.json +++ b/docs/sidebars.json @@ -346,6 +346,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 0000000000..a80b4fcabf --- /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" +} +--- + +<!-- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +--> + +## 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 5903259e5f..8b0df0f76c 100644 --- a/gensrc/script/doris_builtins_functions.py +++ b/gensrc/script/doris_builtins_functions.py @@ -996,6 +996,7 @@ visible_functions = { [['to_days'], 'INT', ['DATEV2'], ''], [['time_to_sec'], 'INT', ['TIME'], ''], + [['sec_to_time'], 'TIME', ['INT'], ''], [['year'], 'SMALLINT', ['DATETIMEV2'], ''], [['month'], 'TINYINT', ['DATETIMEV2'], ''], --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
