diff --git a/dbms/src/Functions/DateTimeTransforms.h b/dbms/src/Functions/DateTimeTransforms.h index 59d69d34abb..5e3b540533c 100644 --- a/dbms/src/Functions/DateTimeTransforms.h +++ b/dbms/src/Functions/DateTimeTransforms.h @@ -188,6 +188,22 @@ struct ToStartOfFiveMinuteImpl using FactorTransform = ZeroTransform; }; +struct ToStartOfTenMinutesImpl +{ + static constexpr auto name = "toStartOfTenMinutes"; + + static inline UInt32 execute(UInt32 t, const DateLUTImpl & time_zone) + { + return time_zone.toStartOfTenMinutes(t); + } + static inline UInt32 execute(UInt16, const DateLUTImpl &) + { + return dateIsNotSupported(name); + } + + using FactorTransform = ZeroTransform; +}; + struct ToStartOfFifteenMinutesImpl { static constexpr auto name = "toStartOfFifteenMinutes"; diff --git a/dbms/src/Functions/registerFunctionsDateTime.cpp b/dbms/src/Functions/registerFunctionsDateTime.cpp index 5751fc800a9..8a97a2aaa3d 100644 --- a/dbms/src/Functions/registerFunctionsDateTime.cpp +++ b/dbms/src/Functions/registerFunctionsDateTime.cpp @@ -21,6 +21,7 @@ void registerFunctionToStartOfQuarter(FunctionFactory &); void registerFunctionToStartOfYear(FunctionFactory &); void registerFunctionToStartOfMinute(FunctionFactory &); void registerFunctionToStartOfFiveMinute(FunctionFactory &); +void registerFunctionToStartOfTenMinutes(FunctionFactory &); void registerFunctionToStartOfFifteenMinutes(FunctionFactory &); void registerFunctionToStartOfHour(FunctionFactory &); void registerFunctionToStartOfISOYear(FunctionFactory &); @@ -82,6 +83,7 @@ void registerFunctionsDateTime(FunctionFactory & factory) registerFunctionToStartOfYear(factory); registerFunctionToStartOfMinute(factory); registerFunctionToStartOfFiveMinute(factory); + registerFunctionToStartOfTenMinutes(factory); registerFunctionToStartOfFifteenMinutes(factory); registerFunctionToStartOfHour(factory); registerFunctionToStartOfISOYear(factory); diff --git a/dbms/src/Functions/toStartOfTenMinutes.cpp b/dbms/src/Functions/toStartOfTenMinutes.cpp new file mode 100644 index 00000000000..d1caa98a6b5 --- /dev/null +++ b/dbms/src/Functions/toStartOfTenMinutes.cpp @@ -0,0 +1,20 @@ +#include +#include +#include +#include +#include + + +namespace DB +{ + +using FunctionToStartOfTenMinutes = FunctionDateOrDateTimeToSomething; + +void registerFunctionToStartOfTenMinutes(FunctionFactory & factory) +{ + factory.registerFunction(); +} + +} + + diff --git a/dbms/tests/queries/0_stateless/00189_time_zones.reference b/dbms/tests/queries/0_stateless/00189_time_zones.reference index b8315b2b723..5cc0d66421a 100644 --- a/dbms/tests/queries/0_stateless/00189_time_zones.reference +++ b/dbms/tests/queries/0_stateless/00189_time_zones.reference @@ -58,16 +58,31 @@ 0 0 0 -2014-09-30 23:50:00 -2014-09-30 21:50:00 -2014-09-30 20:50:00 -2014-10-01 04:50:00 -2014-09-30 11:50:00 -2014-09-30 23:00:00 -2014-09-30 21:00:00 -2014-09-30 20:00:00 -2014-10-01 04:00:00 -2014-09-30 11:00:00 +2019-02-06 22:57:00 +2019-02-06 20:57:00 +2019-02-06 19:57:00 +2019-02-07 04:57:00 +2019-02-06 11:57:00 +2019-02-06 22:55:00 +2019-02-06 20:55:00 +2019-02-06 19:55:00 +2019-02-07 04:55:00 +2019-02-06 11:55:00 +2019-02-06 22:50:00 +2019-02-06 20:50:00 +2019-02-06 19:50:00 +2019-02-07 04:50:00 +2019-02-06 11:50:00 +2019-02-06 22:45:00 +2019-02-06 20:45:00 +2019-02-06 19:45:00 +2019-02-07 04:45:00 +2019-02-06 11:45:00 +2019-02-06 22:00:00 +2019-02-06 20:00:00 +2019-02-06 19:00:00 +2019-02-07 04:00:00 +2019-02-06 11:00:00 44 44 44 diff --git a/dbms/tests/queries/0_stateless/00189_time_zones.sql b/dbms/tests/queries/0_stateless/00189_time_zones.sql index d922eb4bcb4..c888b547723 100644 --- a/dbms/tests/queries/0_stateless/00189_time_zones.sql +++ b/dbms/tests/queries/0_stateless/00189_time_zones.sql @@ -104,19 +104,43 @@ SELECT toSecond(toDateTime(1412106600), 'Pacific/Pitcairn'); /* toStartOfMinute */ -SELECT toString(toStartOfMinute(toDateTime(1412106600), 'Europe/Moscow'), 'Europe/Moscow'); -SELECT toString(toStartOfMinute(toDateTime(1412106600), 'Europe/Paris'), 'Europe/Paris'); -SELECT toString(toStartOfMinute(toDateTime(1412106600), 'Europe/London'), 'Europe/London'); -SELECT toString(toStartOfMinute(toDateTime(1412106600), 'Asia/Tokyo'), 'Asia/Tokyo'); -SELECT toString(toStartOfMinute(toDateTime(1412106600), 'Pacific/Pitcairn'), 'Pacific/Pitcairn'); +SELECT toString(toStartOfMinute(toDateTime(1549483055), 'Europe/Moscow'), 'Europe/Moscow'); +SELECT toString(toStartOfMinute(toDateTime(1549483055), 'Europe/Paris'), 'Europe/Paris'); +SELECT toString(toStartOfMinute(toDateTime(1549483055), 'Europe/London'), 'Europe/London'); +SELECT toString(toStartOfMinute(toDateTime(1549483055), 'Asia/Tokyo'), 'Asia/Tokyo'); +SELECT toString(toStartOfMinute(toDateTime(1549483055), 'Pacific/Pitcairn'), 'Pacific/Pitcairn'); + +/* toStartOfFiveMinute */ + +SELECT toString(toStartOfFiveMinute(toDateTime(1549483055), 'Europe/Moscow'), 'Europe/Moscow'); +SELECT toString(toStartOfFiveMinute(toDateTime(1549483055), 'Europe/Paris'), 'Europe/Paris'); +SELECT toString(toStartOfFiveMinute(toDateTime(1549483055), 'Europe/London'), 'Europe/London'); +SELECT toString(toStartOfFiveMinute(toDateTime(1549483055), 'Asia/Tokyo'), 'Asia/Tokyo'); +SELECT toString(toStartOfFiveMinute(toDateTime(1549483055), 'Pacific/Pitcairn'), 'Pacific/Pitcairn'); + +/* toStartOfTenMinutes */ + +SELECT toString(toStartOfTenMinutes(toDateTime(1549483055), 'Europe/Moscow'), 'Europe/Moscow'); +SELECT toString(toStartOfTenMinutes(toDateTime(1549483055), 'Europe/Paris'), 'Europe/Paris'); +SELECT toString(toStartOfTenMinutes(toDateTime(1549483055), 'Europe/London'), 'Europe/London'); +SELECT toString(toStartOfTenMinutes(toDateTime(1549483055), 'Asia/Tokyo'), 'Asia/Tokyo'); +SELECT toString(toStartOfTenMinutes(toDateTime(1549483055), 'Pacific/Pitcairn'), 'Pacific/Pitcairn'); + +/* toStartOfTenMinutes */ + +SELECT toString(toStartOfFifteenMinutes(toDateTime(1549483055), 'Europe/Moscow'), 'Europe/Moscow'); +SELECT toString(toStartOfFifteenMinutes(toDateTime(1549483055), 'Europe/Paris'), 'Europe/Paris'); +SELECT toString(toStartOfFifteenMinutes(toDateTime(1549483055), 'Europe/London'), 'Europe/London'); +SELECT toString(toStartOfFifteenMinutes(toDateTime(1549483055), 'Asia/Tokyo'), 'Asia/Tokyo'); +SELECT toString(toStartOfFifteenMinutes(toDateTime(1549483055), 'Pacific/Pitcairn'), 'Pacific/Pitcairn'); /* toStartOfHour */ -SELECT toString(toStartOfHour(toDateTime(1412106600), 'Europe/Moscow'), 'Europe/Moscow'); -SELECT toString(toStartOfHour(toDateTime(1412106600), 'Europe/Paris'), 'Europe/Paris'); -SELECT toString(toStartOfHour(toDateTime(1412106600), 'Europe/London'), 'Europe/London'); -SELECT toString(toStartOfHour(toDateTime(1412106600), 'Asia/Tokyo'), 'Asia/Tokyo'); -SELECT toString(toStartOfHour(toDateTime(1412106600), 'Pacific/Pitcairn'), 'Pacific/Pitcairn'); +SELECT toString(toStartOfHour(toDateTime(1549483055), 'Europe/Moscow'), 'Europe/Moscow'); +SELECT toString(toStartOfHour(toDateTime(1549483055), 'Europe/Paris'), 'Europe/Paris'); +SELECT toString(toStartOfHour(toDateTime(1549483055), 'Europe/London'), 'Europe/London'); +SELECT toString(toStartOfHour(toDateTime(1549483055), 'Asia/Tokyo'), 'Asia/Tokyo'); +SELECT toString(toStartOfHour(toDateTime(1549483055), 'Pacific/Pitcairn'), 'Pacific/Pitcairn'); /* toRelativeYearNum */ diff --git a/libs/libcommon/include/common/DateLUTImpl.h b/libs/libcommon/include/common/DateLUTImpl.h index 936efa31ae4..dd727ac843d 100644 --- a/libs/libcommon/include/common/DateLUTImpl.h +++ b/libs/libcommon/include/common/DateLUTImpl.h @@ -284,6 +284,15 @@ public: inline time_t toStartOfFiveMinute(time_t t) const { return t / 300 * 300; } inline time_t toStartOfFifteenMinutes(time_t t) const { return t / 900 * 900; } + inline time_t toStartOfTenMinutes(time_t t) const + { + if (offset_is_whole_number_of_hours_everytime) + return t / 600 * 600; + + time_t date = find(t).date; + return date + (t - date) / 600 * 600; + } + inline time_t toStartOfHour(time_t t) const { if (offset_is_whole_number_of_hours_everytime)