mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-21 15:12:02 +00:00
Introduce quarter interval kind as 3 months (in preparation for #3705)
This commit is contained in:
parent
5caab32340
commit
362948e891
@ -19,6 +19,7 @@ void registerDataTypeInterval(DataTypeFactory & factory)
|
||||
factory.registerSimpleDataType("IntervalDay", [] { return DataTypePtr(std::make_shared<DataTypeInterval>(DataTypeInterval::Day)); });
|
||||
factory.registerSimpleDataType("IntervalWeek", [] { return DataTypePtr(std::make_shared<DataTypeInterval>(DataTypeInterval::Week)); });
|
||||
factory.registerSimpleDataType("IntervalMonth", [] { return DataTypePtr(std::make_shared<DataTypeInterval>(DataTypeInterval::Month)); });
|
||||
factory.registerSimpleDataType("IntervalQuarter", [] { return DataTypePtr(std::make_shared<DataTypeInterval>(DataTypeInterval::Quarter)); });
|
||||
factory.registerSimpleDataType("IntervalYear", [] { return DataTypePtr(std::make_shared<DataTypeInterval>(DataTypeInterval::Year)); });
|
||||
}
|
||||
|
||||
|
@ -25,6 +25,7 @@ public:
|
||||
Day,
|
||||
Week,
|
||||
Month,
|
||||
Quarter,
|
||||
Year
|
||||
};
|
||||
|
||||
@ -46,6 +47,7 @@ public:
|
||||
case Day: return "Day";
|
||||
case Week: return "Week";
|
||||
case Month: return "Month";
|
||||
case Quarter: return "Quarter";
|
||||
case Year: return "Year";
|
||||
default: __builtin_unreachable();
|
||||
}
|
||||
|
@ -113,6 +113,21 @@ struct AddMonthsImpl
|
||||
}
|
||||
};
|
||||
|
||||
struct AddQuartersImpl
|
||||
{
|
||||
static constexpr auto name = "addQuarters";
|
||||
|
||||
static inline UInt32 execute(UInt32 t, Int64 delta, const DateLUTImpl & time_zone)
|
||||
{
|
||||
return time_zone.addQuarters(t, delta);
|
||||
}
|
||||
|
||||
static inline UInt16 execute(UInt16 d, Int64 delta, const DateLUTImpl & time_zone)
|
||||
{
|
||||
return time_zone.addQuarters(DayNum(d), delta);
|
||||
}
|
||||
};
|
||||
|
||||
struct AddYearsImpl
|
||||
{
|
||||
static constexpr auto name = "addYears";
|
||||
@ -149,6 +164,7 @@ struct SubtractHoursImpl : SubtractIntervalImpl<AddHoursImpl> { static constexpr
|
||||
struct SubtractDaysImpl : SubtractIntervalImpl<AddDaysImpl> { static constexpr auto name = "subtractDays"; };
|
||||
struct SubtractWeeksImpl : SubtractIntervalImpl<AddWeeksImpl> { static constexpr auto name = "subtractWeeks"; };
|
||||
struct SubtractMonthsImpl : SubtractIntervalImpl<AddMonthsImpl> { static constexpr auto name = "subtractMonths"; };
|
||||
struct SubtractQuartersImpl : SubtractIntervalImpl<AddQuartersImpl> { static constexpr auto name = "subtractQuarters"; };
|
||||
struct SubtractYearsImpl : SubtractIntervalImpl<AddYearsImpl> { static constexpr auto name = "subtractYears"; };
|
||||
|
||||
|
||||
|
@ -89,6 +89,7 @@ void registerFunctionsConversion(FunctionFactory & factory)
|
||||
factory.registerFunction<FunctionConvert<DataTypeInterval, NameToIntervalDay, PositiveMonotonicity>>();
|
||||
factory.registerFunction<FunctionConvert<DataTypeInterval, NameToIntervalWeek, PositiveMonotonicity>>();
|
||||
factory.registerFunction<FunctionConvert<DataTypeInterval, NameToIntervalMonth, PositiveMonotonicity>>();
|
||||
factory.registerFunction<FunctionConvert<DataTypeInterval, NameToIntervalQuarter, PositiveMonotonicity>>();
|
||||
factory.registerFunction<FunctionConvert<DataTypeInterval, NameToIntervalYear, PositiveMonotonicity>>();
|
||||
}
|
||||
|
||||
|
@ -738,6 +738,7 @@ DEFINE_NAME_TO_INTERVAL(Hour)
|
||||
DEFINE_NAME_TO_INTERVAL(Day)
|
||||
DEFINE_NAME_TO_INTERVAL(Week)
|
||||
DEFINE_NAME_TO_INTERVAL(Month)
|
||||
DEFINE_NAME_TO_INTERVAL(Quarter)
|
||||
DEFINE_NAME_TO_INTERVAL(Year)
|
||||
|
||||
#undef DEFINE_NAME_TO_INTERVAL
|
||||
|
18
dbms/src/Functions/addQuarters.cpp
Normal file
18
dbms/src/Functions/addQuarters.cpp
Normal file
@ -0,0 +1,18 @@
|
||||
#include <Functions/IFunction.h>
|
||||
#include <Functions/FunctionFactory.h>
|
||||
#include <Functions/FunctionDateOrDateTimeAddInterval.h>
|
||||
|
||||
|
||||
namespace DB
|
||||
{
|
||||
|
||||
using FunctionAddQuarters = FunctionDateOrDateTimeAddInterval<AddQuartersImpl>;
|
||||
|
||||
void registerFunctionAddQuarters(FunctionFactory & factory)
|
||||
{
|
||||
factory.registerFunction<FunctionAddQuarters>();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -47,6 +47,7 @@ void registerFunctionAddHours(FunctionFactory &);
|
||||
void registerFunctionAddDays(FunctionFactory &);
|
||||
void registerFunctionAddWeeks(FunctionFactory &);
|
||||
void registerFunctionAddMonths(FunctionFactory &);
|
||||
void registerFunctionAddQuarters(FunctionFactory &);
|
||||
void registerFunctionAddYears(FunctionFactory &);
|
||||
void registerFunctionSubtractSeconds(FunctionFactory &);
|
||||
void registerFunctionSubtractMinutes(FunctionFactory &);
|
||||
@ -54,6 +55,7 @@ void registerFunctionSubtractHours(FunctionFactory &);
|
||||
void registerFunctionSubtractDays(FunctionFactory &);
|
||||
void registerFunctionSubtractWeeks(FunctionFactory &);
|
||||
void registerFunctionSubtractMonths(FunctionFactory &);
|
||||
void registerFunctionSubtractQuarters(FunctionFactory &);
|
||||
void registerFunctionSubtractYears(FunctionFactory &);
|
||||
void registerFunctionDateDiff(FunctionFactory &);
|
||||
void registerFunctionToTimeZone(FunctionFactory &);
|
||||
@ -106,13 +108,14 @@ void registerFunctionsDateTime(FunctionFactory & factory)
|
||||
registerFunctionAddDays(factory);
|
||||
registerFunctionAddWeeks(factory);
|
||||
registerFunctionAddMonths(factory);
|
||||
registerFunctionAddQuarters(factory);
|
||||
registerFunctionAddYears(factory);
|
||||
registerFunctionSubtractSeconds(factory);
|
||||
registerFunctionSubtractMinutes(factory);
|
||||
registerFunctionSubtractHours(factory);
|
||||
registerFunctionSubtractDays(factory);
|
||||
registerFunctionSubtractWeeks(factory);
|
||||
registerFunctionSubtractMonths(factory);
|
||||
registerFunctionSubtractQuarters(factory);
|
||||
registerFunctionSubtractYears(factory);
|
||||
registerFunctionDateDiff(factory);
|
||||
registerFunctionToTimeZone(factory);
|
||||
|
18
dbms/src/Functions/subtractQuarters.cpp
Normal file
18
dbms/src/Functions/subtractQuarters.cpp
Normal file
@ -0,0 +1,18 @@
|
||||
#include <Functions/IFunction.h>
|
||||
#include <Functions/FunctionFactory.h>
|
||||
#include <Functions/FunctionDateOrDateTimeAddInterval.h>
|
||||
|
||||
|
||||
namespace DB
|
||||
{
|
||||
|
||||
using FunctionSubtractQuarters = FunctionDateOrDateTimeAddInterval<SubtractQuartersImpl>;
|
||||
|
||||
void registerFunctionSubtractQuarters(FunctionFactory & factory)
|
||||
{
|
||||
factory.registerFunction<FunctionSubtractQuarters>();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -621,6 +621,8 @@ bool ParserIntervalOperatorExpression::parseImpl(Pos & pos, ASTPtr & node, Expec
|
||||
function_name = "toIntervalWeek";
|
||||
else if (ParserKeyword("MONTH").ignore(pos, expected))
|
||||
function_name = "toIntervalMonth";
|
||||
else if (ParserKeyword("QUARTER").ignore(pos, expected))
|
||||
function_name = "toIntervalQuarter";
|
||||
else if (ParserKeyword("YEAR").ignore(pos, expected))
|
||||
function_name = "toIntervalYear";
|
||||
else
|
||||
|
@ -36,3 +36,4 @@
|
||||
2029-02-28 01:02:03 2017-03-29 01:02:03
|
||||
2030-02-28 01:02:03 2017-04-29 01:02:03
|
||||
2031-02-28 01:02:03 2017-05-29 01:02:03
|
||||
2015-11-29 01:02:03
|
||||
|
@ -2,3 +2,4 @@ SELECT toDateTime('2017-10-30 08:18:19') + INTERVAL 1 DAY + INTERVAL 1 MONTH - I
|
||||
SELECT toDateTime('2017-10-30 08:18:19') + INTERVAL 1 HOUR + INTERVAL 1000 MINUTE + INTERVAL 10 SECOND;
|
||||
SELECT toDateTime('2017-10-30 08:18:19') + INTERVAL 1 DAY + INTERVAL number MONTH FROM system.numbers LIMIT 20;
|
||||
SELECT toDateTime('2016-02-29 01:02:03') + INTERVAL number YEAR, toDateTime('2016-02-29 01:02:03') + INTERVAL number MONTH FROM system.numbers LIMIT 16;
|
||||
SELECT toDateTime('2016-02-29 01:02:03') - INTERVAL 1 QUARTER;
|
||||
|
@ -584,6 +584,16 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
inline time_t addQuarters(time_t t, Int64 delta) const
|
||||
{
|
||||
return addMonths(t, delta * 3);
|
||||
}
|
||||
|
||||
inline DayNum addQuarters(DayNum d, Int64 delta) const
|
||||
{
|
||||
return addMonths(d, delta * 3);
|
||||
}
|
||||
|
||||
/// Saturation can occur if 29 Feb is mapped to non-leap year.
|
||||
inline time_t addYears(time_t t, Int64 delta) const
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user