Primitive data types

The terms "simple", "primitive", and "elementary" data types are used synonymously.

Numeric types

Type Description Notes
Bool Boolean value.
Int8 A signed integer.
Acceptable values: from -27 to 27–1.
Int16 A signed integer.
Acceptable values: from –215 to 215–1.
Int32 A signed integer.
Acceptable values: from –231 to 231–1.
Int64 A signed integer.
Acceptable values: from –263 to 263–1.
Uint8 Unsigned integer.
Permitted values: from 0 to 28–1.
Uint16 Unsigned integer.
Permitted values: from 0 to 216–1.
Uint32 Unsigned integer.
Permitted values: from 0 to 232–1.
Uint64 Unsigned integer.
Permitted values: from 0 to 264–1.
Float A real number with variable precision, 4 bytes in size.
Double A real number with variable precision, 8 bytes in size.
Decimal A real number with the specified precision, up to 35 decimal digits
DyNumber Binary representation of a real number with a precision of 38 characters.
Allowed values: positive numbers from 1×10-130 to 1×10126–1, negative numbers from -1×10126–1 to -1×10-130, and 0.
Compatible with the AWS DynamoDB Number type. Not recommended for use in apps native to YTsaurus.

String types

Type Description Notes
String A string that can contain any binary data
Utf8 UTF-8-coded text.
Json JSON represented as text
JsonDocument JSON in an indexed binary representation
Yson YSON in textual or binary presentation
Uuid UUID universal identifier

Unlike the JSON data type that stores the original text representation passed by the user, JsonDocument uses an indexed binary representation. An important difference from the point of view of semantics is that JsonDocument doesn't preserve formatting, the order of keys in objects, or their duplicates.

Thanks to the indexed view, JsonDocument lets you bypass the document model using JsonPath without the need to parse the full content. This helps efficiently perform operations from the JSON API, reducing delays and the cost of user queries. Execution of JsonDocument queries can be up to several times more efficient depending on the type of load.

Due to the added redundancy, JsonDocument is less effective in storage. The additional storage overhead depends on the specific content, but is 20-30% of the original volume on average. Saving data in JsonDocument format requires additional conversion from the textual representation, which makes writing it less efficient. However, for most read-intensive scenarios that involve processing data from JSON, this data type is preferred and recommended.

Warning

Double type is used to store (JSON Number) numerical values in JsonDocument and perform arithmetic operations over them in JSON API. Precision might be lost when non-standard representations of numbers are used in the source JSON document.

Date and time

Type Description Notes
Date Date, precision to the day Range of values for all temporal types except Interval: From 00:00 01.01.1970 to 00:00 01.01.2106. Internal Date representation: Unsigned 16-bit integer
Datetime Date/time, precision to the second Internal representation: Unsigned 32-bit integer
Timestamp Date/time, precision to the microsecond Internal representation: Unsigned 64-bit integer
Interval Time interval (signed), precision to microseconds Value range: From -136 years to +136 years. Internal representation: Signed 64-bit integer.
TzDate Date with time zone label, precision to the day
TzDatetime Date/time with time zone label, precision to the second
TzTimestamp Date/time with time zone label, precision to the microsecond

Supporting types with a time zone label

Time zone label for the TzDate, TzDatetime, TzTimestamp types is an attribute that is used:

The point in time for these types is stored in UTC, and the timezone label doesn't participate in any other calculations in any way. For example:

SELECT --these expressions are always true for any timezones: the timezone doesn't affect the point in time.
    AddTimezone(CurrentUtcDate(), "Europe/Moscow") ==
        AddTimezone(CurrentUtcDate(), "America/New_York"),
    AddTimezone(CurrentUtcDatetime(), "Europe/Moscow") ==
        AddTimezone(CurrentUtcDatetime(), "America/New_York");

Keep in mind that when converting between TzDate and TzDatetime, or TzTimestamp the date's midnight doesn't follow the local time zone, but midnight in UTC for the date in UTC.

Casting between data types

Explicit casting

Explicit casting using CAST:

Casting to numeric types

Type Bool Int8 Int16 Int32 Int64 Uint8 Uint16 Uint32 Uint64 Float Double Decimal
Bool Yes1 Yes1 Yes1 Yes1 Yes1 Yes1 Yes1 Yes1 Yes1 Yes1 No
Int8 Yes2 Yes Yes Yes Yes3 Yes3 Yes3 Yes3 Yes Yes Yes
Int16 Yes2 Yes4 Yes Yes Yes3,4 Yes3 Yes3 Yes3 Yes Yes Yes
Int32 Yes2 Yes4 Yes4 Yes Yes3,4 Yes3,4 Yes3 Yes3 Yes Yes Yes
Int64 Yes2 Yes4 Yes4 Yes4 Yes3,4 Yes3,4 Yes3,4 Yes3 Yes Yes Yes
Uint8 Yes2 Yes4 Yes Yes Yes Yes Yes Yes Yes Yes Yes
Uint16 Yes2 Yes4 Yes4 Yes Yes Yes4 Yes Yes Yes Yes Yes
Uint32 Yes2 Yes4 Yes4 Yes4 Yes Yes4 Yes4 Yes Yes Yes Yes
Uint64 Yes2 Yes4 Yes4 Yes4 Yes4 Yes4 Yes4 Yes4 Yes Yes Yes
Float Yes2 Yes4 Yes4 Yes4 Yes4 Yes3,4 Yes3,4 Yes3,4 Yes3,4 Yes No
Double Yes2 Yes4 Yes4 Yes4 Yes4 Yes3,4 Yes3,4 Yes3,4 Yes3,4 Yes No
Decimal No Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes
String Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes
Utf8 Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes
Json No No No No No No No No No No No No
Yson Yes5 Yes5 Yes5 Yes5 Yes5 Yes5 Yes5 Yes5 Yes5 Yes5 Yes5 No
Uuid No No No No No No No No No No No No
Date No Yes4 Yes4 Yes Yes Yes4 Yes Yes Yes Yes Yes Yes
Datetime No Yes4 Yes4 Yes4 Yes Yes4 Yes4 Yes Yes Yes Yes No
Timestamp No Yes4 Yes4 Yes4 Yes4 Yes4 Yes4 Yes4 Yes Yes Yes No
Interval No Yes4 Yes4 Yes4 Yes Yes3,4 Yes3,4 Yes3,4 Yes3 Yes Yes No

1 True is converted to 1 and False to 0.
2 Any value other than 0 is converted to True, 0 is converted to False.
3 Possible only in the case of a non-negative value.
4 Possible only in the case of a value falling within the allowed range.
5 Using the built-in function Yson::ConvertTo.

Converting to date and time data types

Type Date Datetime Timestamp Interval
Bool No No No No
Int8 Yes Yes Yes Yes
Int16 Yes Yes Yes Yes
Int32 Yes Yes Yes Yes
Int64 Yes Yes Yes Yes
Uint8 Yes Yes Yes Yes
Uint16 Yes Yes Yes Yes
Uint32 Yes Yes Yes Yes
Uint64 Yes Yes Yes Yes
Float No No No No
Double No No No No
Decimal No No No No
String Yes Yes Yes Yes
Utf8 Yes Yes Yes Yes
Json No No No No
Yson No No No No
Uuid No No No No
Date Yes Yes No
Datetime Yes Yes No
Timestamp Yes Yes No
Interval No No No

Conversion to other data types

Type String Utf8 Json Yson Uuid
Bool Yes No No No No
Int8 Yes No No No No
Int16 Yes No No No No
Int32 Yes No No No No
Int64 Yes No No No No
Uint8 Yes No No No No
Uint16 Yes No No No No
Uint32 Yes No No No No
Uint64 Yes No No No No
Float Yes No No No No
Double Yes No No No No
Decimal Yes No No No No
String Yes Yes Yes Yes
Utf8 Yes No No No
Json Yes Yes No No
Yson Yes1 No No No No
Uuid Yes Yes No No
Date Yes Yes No No No
Datetime Yes Yes No No No
Timestamp Yes Yes No No No
Interval Yes Yes No No No

1 Using the built-in function Yson::ConvertTo.

Examples

    SELECT
        CAST("12345" AS Double),                -- 12345.0
        CAST(1.2345 AS Uint8),                  -- 1
        CAST(12345 AS String),                  -- "12345"
        CAST("1.2345" AS Decimal(5, 2)),        -- 1.23
        CAST("xyz" AS Uint64) IS NULL,          -- true, because it failed
        CAST(-1 AS Uint16) IS NULL,             -- true, negative to unsigned
        CAST([-1, 0, 1] AS List<Uint8?>),             -- [null, 0, 1]
            --Optional item type: failed item to null.
        CAST(["3.14", "bad", "42"] AS List<Float>),   -- [3.14, 42]
            --Non-optional item type: failed item deleted.
        CAST(255 AS Uint8),                     -- 255
        CAST(256 AS Uint8) IS NULL              -- true, out of range

Implicit casting

Implicit type casting that occurs in basic operations (+, -, *, /, %) between different data types. The table cells specify the operation result type, if the operation is possible:

Numeric types

If the numeric types don't match, both arguments are BitCast to the result type before performing the operation.

Type Int8 Int16 Int32 Int64 Uint8 Uint16 Uint32 Uint64 Float Double
Int8 Int16 Int32 Int64 Int8 Uint16 Uint32 Uint64 Float Double
Int16 Int16 Int32 Int64 Int16 Int16 Uint32 Uint64 Float Double
Int32 Int32 Int32 Int64 Int32 Int32 Int32 Uint64 Float Double
Int64 Int64 Int64 Int64 Int64 Int64 Int64 Int64 Float Double
Uint8 Int8 Int16 Int32 Int64 Uint16 Uint32 Uint64 Float Double
Uint16 Uint16 Int16 Int32 Int64 Uint16 Uint32 Uint64 Float Double
Uint32 Uint32 Uint32 Int32 Int64 Uint32 Uint32 Uint64 Float Double
Uint64 Uint64 Uint64 Uint64 Int64 Uint64 Uint64 Uint64 Float Double
Float Float Float Float Float Float Float Float Float Double
Double Double Double Double Double Double Double Double Double Double

Date and time types

Type Date Datetime Timestamp Interval TzDate TzDatetime TzTimestamp
Date Date
Datetime Datetime
Timestamp Timestamp
Interval Date Datetime Timestamp TzDate TzDatetime TzTimestamp
TzDate TzDate
TzDatetime TzDatetime
TzTimestamp TzTimestamp
Previous