Merge pull request #4298 from vitlibar/add-function-to-start-of-ten-minutes

Add function toStartOfTenMinutes().
This commit is contained in:
Vitaly Baranov 2019-02-07 11:46:13 +03:00 committed by GitHub
commit 7ff5439971
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 106 additions and 20 deletions

View File

@ -188,6 +188,22 @@ struct ToStartOfFiveMinuteImpl
using FactorTransform = ZeroTransform; 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 struct ToStartOfFifteenMinutesImpl
{ {
static constexpr auto name = "toStartOfFifteenMinutes"; static constexpr auto name = "toStartOfFifteenMinutes";

View File

@ -21,6 +21,7 @@ void registerFunctionToStartOfQuarter(FunctionFactory &);
void registerFunctionToStartOfYear(FunctionFactory &); void registerFunctionToStartOfYear(FunctionFactory &);
void registerFunctionToStartOfMinute(FunctionFactory &); void registerFunctionToStartOfMinute(FunctionFactory &);
void registerFunctionToStartOfFiveMinute(FunctionFactory &); void registerFunctionToStartOfFiveMinute(FunctionFactory &);
void registerFunctionToStartOfTenMinutes(FunctionFactory &);
void registerFunctionToStartOfFifteenMinutes(FunctionFactory &); void registerFunctionToStartOfFifteenMinutes(FunctionFactory &);
void registerFunctionToStartOfHour(FunctionFactory &); void registerFunctionToStartOfHour(FunctionFactory &);
void registerFunctionToStartOfISOYear(FunctionFactory &); void registerFunctionToStartOfISOYear(FunctionFactory &);
@ -82,6 +83,7 @@ void registerFunctionsDateTime(FunctionFactory & factory)
registerFunctionToStartOfYear(factory); registerFunctionToStartOfYear(factory);
registerFunctionToStartOfMinute(factory); registerFunctionToStartOfMinute(factory);
registerFunctionToStartOfFiveMinute(factory); registerFunctionToStartOfFiveMinute(factory);
registerFunctionToStartOfTenMinutes(factory);
registerFunctionToStartOfFifteenMinutes(factory); registerFunctionToStartOfFifteenMinutes(factory);
registerFunctionToStartOfHour(factory); registerFunctionToStartOfHour(factory);
registerFunctionToStartOfISOYear(factory); registerFunctionToStartOfISOYear(factory);

View File

@ -0,0 +1,20 @@
#include <Functions/IFunction.h>
#include <Functions/FunctionFactory.h>
#include <Functions/DateTimeTransforms.h>
#include <Functions/FunctionDateOrDateTimeToSomething.h>
#include <DataTypes/DataTypesNumber.h>
namespace DB
{
using FunctionToStartOfTenMinutes = FunctionDateOrDateTimeToSomething<DataTypeDateTime, ToStartOfTenMinutesImpl>;
void registerFunctionToStartOfTenMinutes(FunctionFactory & factory)
{
factory.registerFunction<FunctionToStartOfTenMinutes>();
}
}

View File

@ -58,16 +58,31 @@
0 0
0 0
0 0
2014-09-30 23:50:00 2019-02-06 22:57:00
2014-09-30 21:50:00 2019-02-06 20:57:00
2014-09-30 20:50:00 2019-02-06 19:57:00
2014-10-01 04:50:00 2019-02-07 04:57:00
2014-09-30 11:50:00 2019-02-06 11:57:00
2014-09-30 23:00:00 2019-02-06 22:55:00
2014-09-30 21:00:00 2019-02-06 20:55:00
2014-09-30 20:00:00 2019-02-06 19:55:00
2014-10-01 04:00:00 2019-02-07 04:55:00
2014-09-30 11:00: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 44
44 44

View File

@ -104,19 +104,43 @@ SELECT toSecond(toDateTime(1412106600), 'Pacific/Pitcairn');
/* toStartOfMinute */ /* toStartOfMinute */
SELECT toString(toStartOfMinute(toDateTime(1412106600), 'Europe/Moscow'), 'Europe/Moscow'); SELECT toString(toStartOfMinute(toDateTime(1549483055), 'Europe/Moscow'), 'Europe/Moscow');
SELECT toString(toStartOfMinute(toDateTime(1412106600), 'Europe/Paris'), 'Europe/Paris'); SELECT toString(toStartOfMinute(toDateTime(1549483055), 'Europe/Paris'), 'Europe/Paris');
SELECT toString(toStartOfMinute(toDateTime(1412106600), 'Europe/London'), 'Europe/London'); SELECT toString(toStartOfMinute(toDateTime(1549483055), 'Europe/London'), 'Europe/London');
SELECT toString(toStartOfMinute(toDateTime(1412106600), 'Asia/Tokyo'), 'Asia/Tokyo'); SELECT toString(toStartOfMinute(toDateTime(1549483055), 'Asia/Tokyo'), 'Asia/Tokyo');
SELECT toString(toStartOfMinute(toDateTime(1412106600), 'Pacific/Pitcairn'), 'Pacific/Pitcairn'); 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 */ /* toStartOfHour */
SELECT toString(toStartOfHour(toDateTime(1412106600), 'Europe/Moscow'), 'Europe/Moscow'); SELECT toString(toStartOfHour(toDateTime(1549483055), 'Europe/Moscow'), 'Europe/Moscow');
SELECT toString(toStartOfHour(toDateTime(1412106600), 'Europe/Paris'), 'Europe/Paris'); SELECT toString(toStartOfHour(toDateTime(1549483055), 'Europe/Paris'), 'Europe/Paris');
SELECT toString(toStartOfHour(toDateTime(1412106600), 'Europe/London'), 'Europe/London'); SELECT toString(toStartOfHour(toDateTime(1549483055), 'Europe/London'), 'Europe/London');
SELECT toString(toStartOfHour(toDateTime(1412106600), 'Asia/Tokyo'), 'Asia/Tokyo'); SELECT toString(toStartOfHour(toDateTime(1549483055), 'Asia/Tokyo'), 'Asia/Tokyo');
SELECT toString(toStartOfHour(toDateTime(1412106600), 'Pacific/Pitcairn'), 'Pacific/Pitcairn'); SELECT toString(toStartOfHour(toDateTime(1549483055), 'Pacific/Pitcairn'), 'Pacific/Pitcairn');
/* toRelativeYearNum */ /* toRelativeYearNum */

View File

@ -284,6 +284,15 @@ public:
inline time_t toStartOfFiveMinute(time_t t) const { return t / 300 * 300; } 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 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 inline time_t toStartOfHour(time_t t) const
{ {
if (offset_is_whole_number_of_hours_everytime) if (offset_is_whole_number_of_hours_everytime)