From 7d079ef6fe92fbab31181673f78130ce4a93c5f7 Mon Sep 17 00:00:00 2001 From: bingquanzhao Date: Fri, 24 Jan 2025 16:16:52 +0800 Subject: [PATCH] Sql function second,second_ceil,second_floor,seconds_add,seconds_diff,seconds_sub,sec_to_time,time_to_sec --- .../date-time-functions/sec-to-time.md | 43 ++++++---- .../date-time-functions/second-ceil.md | 82 +++++++++++++------ .../date-time-functions/second-floor.md | 82 +++++++++++++------ .../date-time-functions/second.md | 35 +++++--- .../date-time-functions/seconds-add.md | 49 ++++++----- .../date-time-functions/seconds-diff.md | 48 +++++++---- .../date-time-functions/seconds-sub.md | 45 ++++++---- .../date-time-functions/time-to-sec.md | 43 ++++++---- .../date-time-functions/sec-to-time.md | 37 +++++---- .../date-time-functions/second-ceil.md | 77 +++++++++++------ .../date-time-functions/second-floor.md | 77 +++++++++++------ .../date-time-functions/second.md | 39 +++++---- .../date-time-functions/seconds-add.md | 38 +++++---- .../date-time-functions/seconds-diff.md | 44 ++++++---- .../date-time-functions/seconds-sub.md | 38 +++++---- .../date-time-functions/time-to-sec.md | 37 +++++---- .../date-time-functions/sec-to-time.md | 37 +++++---- .../date-time-functions/second-ceil.md | 77 +++++++++++------ .../date-time-functions/second-floor.md | 77 +++++++++++------ .../date-time-functions/second.md | 36 ++++---- .../date-time-functions/seconds-add.md | 38 +++++---- .../date-time-functions/seconds-diff.md | 44 ++++++---- .../date-time-functions/seconds-sub.md | 38 +++++---- .../date-time-functions/time-to-sec.md | 37 +++++---- .../date-time-functions/sec-to-time.md | 37 +++++---- .../date-time-functions/second-ceil.md | 77 +++++++++++------ .../date-time-functions/second-floor.md | 77 +++++++++++------ .../date-time-functions/second.md | 39 +++++---- .../date-time-functions/seconds-add.md | 38 +++++---- .../date-time-functions/seconds-diff.md | 44 ++++++---- .../date-time-functions/seconds-sub.md | 38 +++++---- .../date-time-functions/time-to-sec.md | 37 +++++---- .../date-time-functions/sec-to-time.md | 37 +++++---- .../date-time-functions/second-ceil.md | 77 +++++++++++------ .../date-time-functions/second-floor.md | 77 +++++++++++------ .../date-time-functions/second.md | 39 +++++---- .../date-time-functions/seconds-add.md | 38 +++++---- .../date-time-functions/seconds-diff.md | 44 ++++++---- .../date-time-functions/seconds-sub.md | 38 +++++---- .../date-time-functions/time-to-sec.md | 37 +++++---- .../date-time-functions/sec-to-time.md | 43 ++++++---- .../date-time-functions/second-ceil.md | 82 +++++++++++++------ .../date-time-functions/second-floor.md | 82 +++++++++++++------ .../date-time-functions/second.md | 40 +++++---- .../date-time-functions/seconds-add.md | 45 ++++++---- .../date-time-functions/seconds-diff.md | 48 +++++++---- .../date-time-functions/seconds-sub.md | 45 ++++++---- .../date-time-functions/time-to-sec.md | 43 ++++++---- .../date-time-functions/sec-to-time.md | 43 ++++++---- .../date-time-functions/second-ceil.md | 82 +++++++++++++------ .../date-time-functions/second-floor.md | 82 +++++++++++++------ .../date-time-functions/second.md | 35 +++++--- .../date-time-functions/seconds-add.md | 45 ++++++---- .../date-time-functions/seconds-diff.md | 48 +++++++---- .../date-time-functions/seconds-sub.md | 45 ++++++---- .../date-time-functions/time-to-sec.md | 43 ++++++---- .../date-time-functions/sec-to-time.md | 43 ++++++---- .../date-time-functions/second-ceil.md | 82 +++++++++++++------ .../date-time-functions/second-floor.md | 82 +++++++++++++------ .../date-time-functions/second.md | 35 +++++--- .../date-time-functions/seconds-add.md | 45 ++++++---- .../date-time-functions/seconds-diff.md | 48 +++++++---- .../date-time-functions/seconds-sub.md | 45 ++++++---- .../date-time-functions/time-to-sec.md | 43 ++++++---- 64 files changed, 2095 insertions(+), 1151 deletions(-) diff --git a/docs/sql-manual/sql-functions/scalar-functions/date-time-functions/sec-to-time.md b/docs/sql-manual/sql-functions/scalar-functions/date-time-functions/sec-to-time.md index c83764cb856fb..375012a2ca75c 100644 --- a/docs/sql-manual/sql-functions/scalar-functions/date-time-functions/sec-to-time.md +++ b/docs/sql-manual/sql-functions/scalar-functions/date-time-functions/sec-to-time.md @@ -24,25 +24,34 @@ specific language governing permissions and limitations under the License. --> -## sec_to_time -### description -#### Syntax +## Description +The `SEC_TO_TIME` function converts a value in seconds into a `TIME` type, returning the result in the format `HH:MM:SS`. +The input seconds represent the time elapsed since the start of a day (`00:00:00`). -`TIME sec_to_time(INT timestamp)` -The parameter is a timestamp of type INT, and the function returns a time of type TIME. +## Syntax -### 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) +```sql +SEC_TO_TIME() ``` +## Parameters + +| Parameter | Description | +|---------------|-------------------------------------------------------------------------------------------------------------------------------------------------------| +| `` | Required. The input number of seconds, representing the time elapsed since the start of a day (00:00:00). Supports positive or negative integers. | -### keywords - SEC_TO_TIME +## Return Value +- Returns a TIME value in the format `HH:MM:SS`, representing the time calculated from the start of a day (00:00:00). +- If is NULL, the function returns NULL. + +## Example +```sql +SELECT SEC_TO_TIME(59738); +``` +```text ++--------------------+ +| sec_to_time(59738) | ++--------------------+ +| 16:35:38 | ++--------------------+ +``` \ No newline at end of file diff --git a/docs/sql-manual/sql-functions/scalar-functions/date-time-functions/second-ceil.md b/docs/sql-manual/sql-functions/scalar-functions/date-time-functions/second-ceil.md index 8c3fa5cc0ebff..0267059455642 100644 --- a/docs/sql-manual/sql-functions/scalar-functions/date-time-functions/second-ceil.md +++ b/docs/sql-manual/sql-functions/scalar-functions/date-time-functions/second-ceil.md @@ -1,6 +1,6 @@ --- { - "title": "second_ceil", + "title": "SECOND_CEIL", "language": "en" } --- @@ -24,39 +24,69 @@ specific language governing permissions and limitations under the License. --> -## second_ceil -### description -#### Syntax +## Description +The function aligns the input datetime value upwards to the nearest second boundary based on the specified period and returns the aligned datetime value. + +## Syntax ```sql -DATETIME SECOND_CEIL(DATETIME datetime) -DATETIME SECOND_CEIL(DATETIME datetime, DATETIME origin) -DATETIME SECOND_CEIL(DATETIME datetime, INT period) -DATETIME SECOND_CEIL(DATETIME datetime, INT period, DATETIME origin) +SECOND_CEIL([, ][, ]) ``` +## Parameters -Convert the date to the nearest rounding up time of the specified time interval period. - -- datetime: a valid date expression. -- period: specifies how many seconds each cycle consists of. -- origin: starting from 0001-01-01T00:00:00. +| Parameter | Description | +|---------------------|---------------------------------------------------------------------------------------------------------------------------| +| `` | Required. The input datetime value. Supports the DATETIME type. | +| `` | Optional. Specifies the number of seconds in each period. Supports positive integers (INT). Defaults to 1 second. | +| `` | Optional. The starting point for alignment. Supports the DATETIME type. Defaults to 0001-01-01T00:00:00 if not specified. | -### example +## Return Value +- Returns a datetime value representing the input datetime aligned upwards to the nearest specified second boundary. +- If `` is NULL, the function returns NULL. +- If `` is an invalid date (e.g., 0000-00-00T00:00:00), the function returns NULL. +## Example +Only specifying `` +```sql +SELECT SECOND_CEIL('2025-01-23 12:34:56'); +``` +```text ++-----------------------------------------------------------+ +| second_ceil(cast('2025-01-23 12:34:56' as DATETIMEV2(0))) | ++-----------------------------------------------------------+ +| 2025-01-23 12:34:56 | ++-----------------------------------------------------------+ ``` -mysql> select second_ceil("2023-07-13 22:28:18", 5); +Specifying `` and `` +```sql +SELECT SECOND_CEIL('2025-01-23 12:34:56', '2025-01-01 00:00:00'); +``` +```text ++---------------------------------------------------------------------------------------------------------+ +| second_ceil(cast('2025-01-23 12:34:56' as DATETIMEV2(0)), cast('2025-01-01 00:00:00' as DATETIMEV2(0))) | ++---------------------------------------------------------------------------------------------------------+ +| 2025-01-23 12:34:56 | ++---------------------------------------------------------------------------------------------------------+ +``` +Specifying `` and `` +```sql +SELECT SECOND_CEIL('2025-01-23 12:34:56', 5) +``` +```text +--------------------------------------------------------------+ -| second_ceil(cast('2023-07-13 22:28:18' as DATETIMEV2(0)), 5) | +| second_ceil(cast('2025-01-23 12:34:56' as DATETIMEV2(0)), 5) | +--------------------------------------------------------------+ -| 2023-07-13 22:28:20 | +| 2025-01-23 12:35:00 | +--------------------------------------------------------------+ -1 row in set (0.01 sec) ``` - -### keywords - - SECOND_CEIL, SECOND, CEIL - -### Best Practice - -See also [date_ceil](./date_ceil) +Specifying ``,`` and `` +```sql +SELECT SECOND_CEIL('2025-01-23 12:34:56', 10, '2025-01-23 12:00:00'); +``` +```text ++-------------------------------------------------------------------------------------------------------------+ +| second_ceil(cast('2025-01-23 12:34:56' as DATETIMEV2(0)), 10, cast('2025-01-23 12:00:00' as DATETIMEV2(0))) | ++-------------------------------------------------------------------------------------------------------------+ +| 2025-01-23 12:35:00 | ++-------------------------------------------------------------------------------------------------------------+ +``` \ No newline at end of file diff --git a/docs/sql-manual/sql-functions/scalar-functions/date-time-functions/second-floor.md b/docs/sql-manual/sql-functions/scalar-functions/date-time-functions/second-floor.md index 4207631f393a8..5e9f420bfdd3e 100644 --- a/docs/sql-manual/sql-functions/scalar-functions/date-time-functions/second-floor.md +++ b/docs/sql-manual/sql-functions/scalar-functions/date-time-functions/second-floor.md @@ -1,6 +1,6 @@ --- { - "title": "second_floor", + "title": "SECOND_FLOOR", "language": "en" } --- @@ -24,39 +24,69 @@ specific language governing permissions and limitations under the License. --> -## second_floor -### description -#### Syntax +## Description +The function aligns the input datetime value upwards to the nearest second boundary based on the specified period and returns the aligned datetime value. + +## Syntax ```sql -DATETIME SECOND_FLOOR(DATETIME datetime) -DATETIME SECOND_FLOOR(DATETIME datetime, DATETIME origin) -DATETIME SECOND_FLOOR(DATETIME datetime, INT period) -DATETIME SECOND_FLOOR(DATETIME datetime, INT period, DATETIME origin) +SECOND_FLOOR([, ][, ]) ``` +## Parameters -Convert the date to the nearest rounding down time of the specified time interval period. - -- datetime: a valid date expression. -- period: specifies how many seconds each cycle consists of. -- origin: starting from 0001-01-01T00:00:00. +| Parameter | Description | +|---------------------|---------------------------------------------------------------------------------------------------------------------------| +| `` | Required. The input datetime value. Supports the DATETIME type. | +| `` | Optional. Specifies the number of seconds in each period. Supports positive integers (INT). Defaults to 1 second. | +| `` | Optional. The starting point for alignment. Supports the DATETIME type. Defaults to 0001-01-01T00:00:00 if not specified. | -### example +## Return Value +- Returns a datetime value representing the input datetime aligned upwards to the nearest specified second boundary. +- If `` is NULL, the function returns NULL. +- If `` is an invalid date (e.g., 0000-00-00T00:00:00), the function returns NULL. +## Example +Only specifying `` +```sql +SELECT SECOND_FLOOR('2025-01-23 12:34:56'); +``` +```text ++------------------------------------------------------------+ +| second_floor(cast('2025-01-23 12:34:56' as DATETIMEV2(0))) | ++------------------------------------------------------------+ +| 2025-01-23 12:34:56 | ++------------------------------------------------------------+ ``` -mysql> select second_floor("2023-07-13 22:28:18", 5); +Specifying `` and `` +```sql +SELECT SECOND_FLOOR('2025-01-23 12:34:56', '2025-01-01 00:00:00'); +``` +```text ++----------------------------------------------------------------------------------------------------------+ +| second_floor(cast('2025-01-23 12:34:56' as DATETIMEV2(0)), cast('2025-01-01 00:00:00' as DATETIMEV2(0))) | ++----------------------------------------------------------------------------------------------------------+ +| 2025-01-23 12:34:56 | ++----------------------------------------------------------------------------------------------------------+ +``` +Specifying `` and `` +```sql +SELECT SECOND_FLOOR('2025-01-23 12:34:56', 5) +``` +```text +---------------------------------------------------------------+ -| second_floor(cast('2023-07-13 22:28:18' as DATETIMEV2(0)), 5) | +| second_floor(cast('2025-01-23 12:34:56' as DATETIMEV2(0)), 5) | +---------------------------------------------------------------+ -| 2023-07-13 22:28:15 | +| 2025-01-23 12:34:55 | +---------------------------------------------------------------+ -1 row in set (0.10 sec) ``` - -### keywords - - SECOND_FLOOR, SECOND, FLOOR - -### Best Practice - -See also [date_floor](./date_floor) +Specifying ``,`` and `` +```sql +SELECT SECOND_FLOOR('2025-01-23 12:34:56', 10, '2025-01-23 12:00:00'); +``` +```text ++--------------------------------------------------------------------------------------------------------------+ +| second_floor(cast('2025-01-23 12:34:56' as DATETIMEV2(0)), 10, cast('2025-01-23 12:00:00' as DATETIMEV2(0))) | ++--------------------------------------------------------------------------------------------------------------+ +| 2025-01-23 12:34:50 | ++--------------------------------------------------------------------------------------------------------------+ +``` \ No newline at end of file diff --git a/docs/sql-manual/sql-functions/scalar-functions/date-time-functions/second.md b/docs/sql-manual/sql-functions/scalar-functions/date-time-functions/second.md index cbe73597cfed9..d788ac919357d 100644 --- a/docs/sql-manual/sql-functions/scalar-functions/date-time-functions/second.md +++ b/docs/sql-manual/sql-functions/scalar-functions/date-time-functions/second.md @@ -25,23 +25,32 @@ under the License. --> ## Description +The function returns the second part of the specified datetime value. The range of seconds is 0 to 59. -Returns second information in the time type, ranging from 0,59 +## Syntax + +```sql +SECOND() +``` +## Parameters -The parameter is Date or Datetime or Time type +| Parameter | Description | +|--------------|--------------------------------------------------------------------| +| `` | The input date or datetime value. Supports DATE or DATETIME types. | -## Syntax -`INT SECOND(DATETIME date)` +## Return Value +- Returns an integer representing the second part of the input datetime value, ranging from 0 to 59. +- If the input is NULL, the function returns NULL. +- If the input is an invalid date (e.g., 0000-00-00 00:00:00), the function returns NULL. ## Example - ```sql -mysql> select second('2018-12-31 23:59:59'); -+-----------------------------+ -| second('2018-12-31 23:59:59') | -+-----------------------------+ -| 59 | -+-----------------------------+ +select second('2018-12-31 23:59:59'); ``` -## Keywords - SECOND +```text ++---------------------------------------------+ +| second(cast('2018-12-30' as DATETIMEV2(0))) | ++---------------------------------------------+ +| 0 | ++---------------------------------------------+ +``` \ No newline at end of file diff --git a/docs/sql-manual/sql-functions/scalar-functions/date-time-functions/seconds-add.md b/docs/sql-manual/sql-functions/scalar-functions/date-time-functions/seconds-add.md index dcf5bdfb8ef59..8786db7e48dd5 100644 --- a/docs/sql-manual/sql-functions/scalar-functions/date-time-functions/seconds-add.md +++ b/docs/sql-manual/sql-functions/scalar-functions/date-time-functions/seconds-add.md @@ -1,7 +1,7 @@ --- { - "title": "SECONDS_ADD", - "language": "en" + "title": "SECONDS_ADD", + "language": "en" } --- @@ -24,27 +24,38 @@ specific language governing permissions and limitations under the License. --> -## seconds_add -### description -#### Syntax +## Description -`DATETIME SECONDS_ADD(DATETIME date, INT seconds)` +The function adds or subtracts a specified number of seconds to/from a given datetime value and returns the resulting +datetime. -ADD a specified number of seconds from a datetime or date +## Syntax -The parameter date can be DATETIME or DATE, and the return type is DATETIME. +```sql +SECONDS_ADD(, ) +``` -### example +## Parameters -``` -mysql> select seconds_add("2020-02-02 02:02:02", 1); -+---------------------------------------+ -| seconds_add('2020-02-02 02:02:02', 1) | -+---------------------------------------+ -| 2020-02-02 02:02:03 | -+---------------------------------------+ -``` +| Parameter | Description | +|--------------|-----------------------------------------------------------------------------------------------------------------------------------------------------| +| `` | Required. The input datetime value. Supports the DATETIME and DATE type. | +| `` | Required. The number of seconds to add or subtract. Supports integers (INT). Positive numbers add seconds, while negative numbers subtract seconds. | + +## Return Value +- Returns a datetime value of the same type as the input . +- If `` is NULL, the function returns NULL. +- If `` is an invalid date (e.g., 0000-00-00T00:00:00), the function returns NULL. -### keywords +## Examples - SECONDS_ADD +``` +SELECT SECONDS_ADD('2025-01-23 12:34:56', 30),SECONDS_ADD('2025-01-23 12:34:56', -30); +``` +```text ++---------------------------------------------------------------+----------------------------------------------------------------+ +| seconds_add(cast('2025-01-23 12:34:56' as DATETIMEV2(0)), 30) | seconds_add(cast('2025-01-23 12:34:56' as DATETIMEV2(0)), -30) | ++---------------------------------------------------------------+----------------------------------------------------------------+ +| 2025-01-23 12:35:26 | 2025-01-23 12:34:26 | ++---------------------------------------------------------------+----------------------------------------------------------------+ +``` diff --git a/docs/sql-manual/sql-functions/scalar-functions/date-time-functions/seconds-diff.md b/docs/sql-manual/sql-functions/scalar-functions/date-time-functions/seconds-diff.md index c8e5e5208f3f9..798bbd90293b6 100644 --- a/docs/sql-manual/sql-functions/scalar-functions/date-time-functions/seconds-diff.md +++ b/docs/sql-manual/sql-functions/scalar-functions/date-time-functions/seconds-diff.md @@ -24,25 +24,37 @@ specific language governing permissions and limitations under the License. --> -## seconds_diff -### description -#### Syntax +## Description +The function calculates the time difference between two datetime values and returns the difference in seconds. -`INT seconds_diff(DATETIME enddate, DATETIME startdate)` - -The difference between the start time and the end time is seconds - -### example +## Syntax +```sql +SECONDS_DIFF(, ) ``` -mysql> select seconds_diff('2020-12-25 22:00:00','2020-12-25 21:00:00'); -+------------------------------------------------------------+ -| seconds_diff('2020-12-25 22:00:00', '2020-12-25 21:00:00') | -+------------------------------------------------------------+ -| 3600 | -+------------------------------------------------------------+ +## Parameters + +| Parameter | Description | +|--------------------|-----------------------------------------------------------------------------| +| `` | Required. The ending datetime value. Supports the DATETIME and DATE type. | +| `` | Required. The starting datetime value. Supports the DATETIME and DATE type. | + +## Return Value +- Returns an integer representing the difference in seconds between two datetime values: + - If `` is later than ``, returns a positive value. + - If `` is earlier than ``, returns a negative value. + - If `` and `` are equal, returns 0. +- If either parameter is NULL, the function returns NULL. +- If the input datetime values are invalid (e.g., 0000-00-00T00:00:00), the function returns NULL. + +## Example +```sql +SELECT SECONDS_DIFF('2025-01-23 12:35:56', '2025-01-23 12:34:56'); +``` +```text ++----------------------------------------------------------------------------------------------------------+ +| seconds_diff(cast('2025-01-23 12:35:56' as DATETIMEV2(0)), cast('2025-01-23 12:34:56' as DATETIMEV2(0))) | ++----------------------------------------------------------------------------------------------------------+ +| 60 | ++----------------------------------------------------------------------------------------------------------+ ``` - -### keywords - - seconds_diff diff --git a/docs/sql-manual/sql-functions/scalar-functions/date-time-functions/seconds-sub.md b/docs/sql-manual/sql-functions/scalar-functions/date-time-functions/seconds-sub.md index 6708256636579..34420b7c046e2 100644 --- a/docs/sql-manual/sql-functions/scalar-functions/date-time-functions/seconds-sub.md +++ b/docs/sql-manual/sql-functions/scalar-functions/date-time-functions/seconds-sub.md @@ -24,27 +24,38 @@ specific language governing permissions and limitations under the License. --> -## seconds_sub -### description -#### Syntax +## Description -`DATETIME SECONDS_SUB(DATETIME date, INT seconds)` +The function subtracts or adds a specified number of seconds to/from a given datetime value and returns the resulting +datetime. -Subtracts a specified number of seconds from a datetime or date +## Syntax -The parameter date can be DATETIME or DATE, and the return type is DATETIME. +```sql +SECONDS_SUB(, ) +``` -### example +## Parameters -``` -mysql> select seconds_sub("2020-01-01 00:00:00", 1); -+---------------------------------------+ -| seconds_sub('2020-01-01 00:00:00', 1) | -+---------------------------------------+ -| 2019-12-31 23:59:59 | -+---------------------------------------+ -``` +| Parameter | Description | +|--------------|-----------------------------------------------------------------------------------------------------------------------------------------------------| +| `` | Required. The input datetime value. Supports the DATETIME and DATE type. | +| `` | Required. The number of seconds to subtract or add. Supports integers (INT). Positive numbers add seconds, while negative numbers subtract seconds. | + +## Return Value +- Returns a datetime value of the same type as the input . +- If `` is NULL, the function returns NULL. +- If `` is an invalid date (e.g., 0000-00-00T00:00:00), the function returns NULL. -### keywords +## Examples - SECONDS_SUB +``` +SELECT SECONDS_SUB('2025-01-23 12:34:56', 30),SECONDS_SUB('2025-01-23 12:34:56', -30); +``` +```text ++---------------------------------------------------------------+----------------------------------------------------------------+ +| seconds_sub(cast('2025-01-23 12:34:56' as DATETIMEV2(0)), 30) | seconds_sub(cast('2025-01-23 12:34:56' as DATETIMEV2(0)), -30) | ++---------------------------------------------------------------+----------------------------------------------------------------+ +| 2025-01-23 12:34:26 | 2025-01-23 12:35:26 | ++---------------------------------------------------------------+----------------------------------------------------------------+ +``` diff --git a/docs/sql-manual/sql-functions/scalar-functions/date-time-functions/time-to-sec.md b/docs/sql-manual/sql-functions/scalar-functions/date-time-functions/time-to-sec.md index f0ac58826eca8..f405043ec3e4d 100644 --- a/docs/sql-manual/sql-functions/scalar-functions/date-time-functions/time-to-sec.md +++ b/docs/sql-manual/sql-functions/scalar-functions/date-time-functions/time-to-sec.md @@ -24,25 +24,34 @@ specific language governing permissions and limitations under the License. --> -## time_to_sec -### description -#### Syntax +## Description +The function converts an input `TIME` or `DATETIME` value into the total time in seconds. If the input is of `DATETIME` type, the function automatically extracts the time part (`HH:MM:SS`). -`INT time_to_sec(TIME datetime)` -input parameter is the time type -Convert the specified time value to seconds, returned result is: hours × 3600+ minutes×60 + seconds. - -### example +## Syntax +```sql +TIME_TO_SEC(