1 | #pragma once |
2 | |
3 | #include <Core/Types.h> |
4 | #include <DataTypes/DataTypeNumberBase.h> |
5 | |
6 | class DateLUTImpl; |
7 | |
8 | namespace DB |
9 | { |
10 | |
11 | /** Mixin-class that manages timezone info for timezone-aware DateTime implementations |
12 | * |
13 | * Must be used as a (second) base for class implementing IDateType-interface. |
14 | */ |
15 | class TimezoneMixin |
16 | { |
17 | public: |
18 | explicit TimezoneMixin(const String & time_zone_name = "" ); |
19 | TimezoneMixin(const TimezoneMixin &) = default; |
20 | |
21 | const DateLUTImpl & getTimeZone() const { return time_zone; } |
22 | |
23 | protected: |
24 | bool has_explicit_time_zone; |
25 | const DateLUTImpl & time_zone; |
26 | const DateLUTImpl & utc_time_zone; |
27 | }; |
28 | |
29 | /** DateTime stores time as unix timestamp. |
30 | * The value itself is independent of time zone. |
31 | * |
32 | * In binary format it is represented as unix timestamp. |
33 | * In text format it is serialized to and parsed from YYYY-MM-DD hh:mm:ss format. |
34 | * The text format is dependent of time zone. |
35 | * |
36 | * To cast from/to text format, time zone may be specified explicitly or implicit time zone may be used. |
37 | * |
38 | * Time zone may be specified explicitly as type parameter, example: DateTime('Europe/Moscow'). |
39 | * As it does not affect the internal representation of values, |
40 | * all types with different time zones are equivalent and may be used interchangingly. |
41 | * Time zone only affects parsing and displaying in text formats. |
42 | * |
43 | * If time zone is not specified (example: DateTime without parameter), then default time zone is used. |
44 | * Default time zone is server time zone, if server is doing transformations |
45 | * and if client is doing transformations, unless 'use_client_time_zone' setting is passed to client; |
46 | * Server time zone is the time zone specified in 'timezone' parameter in configuration file, |
47 | * or system time zone at the moment of server startup. |
48 | */ |
49 | class DataTypeDateTime final : public DataTypeNumberBase<UInt32>, public TimezoneMixin |
50 | { |
51 | public: |
52 | explicit DataTypeDateTime(const String & time_zone_name = "" , const String & type_name_ = "DateTime" ); |
53 | explicit DataTypeDateTime(const TimezoneMixin & time_zone); |
54 | |
55 | static constexpr auto family_name = "DateTime" ; |
56 | |
57 | const char * getFamilyName() const override { return family_name; } |
58 | String doGetName() const override; |
59 | TypeIndex getTypeId() const override { return TypeIndex::DateTime; } |
60 | |
61 | void serializeText(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings &) const override; |
62 | void deserializeWholeText(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const override; |
63 | void serializeTextEscaped(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings &) const override; |
64 | void deserializeTextEscaped(IColumn & column, ReadBuffer & istr, const FormatSettings &) const override; |
65 | void serializeTextQuoted(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings &) const override; |
66 | void deserializeTextQuoted(IColumn & column, ReadBuffer & istr, const FormatSettings &) const override; |
67 | void serializeTextJSON(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings &) const override; |
68 | void deserializeTextJSON(IColumn & column, ReadBuffer & istr, const FormatSettings &) const override; |
69 | void serializeTextCSV(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings &) const override; |
70 | void deserializeTextCSV(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const override; |
71 | void serializeProtobuf(const IColumn & column, size_t row_num, ProtobufWriter & protobuf, size_t & value_index) const override; |
72 | void deserializeProtobuf(IColumn & column, ProtobufReader & protobuf, bool allow_add_row, bool & row_added) const override; |
73 | |
74 | bool canBeUsedAsVersion() const override { return true; } |
75 | bool canBeInsideNullable() const override { return true; } |
76 | |
77 | bool equals(const IDataType & rhs) const override; |
78 | private: |
79 | const String type_name; |
80 | }; |
81 | |
82 | } |
83 | |
84 | |