<!--

    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at
    
        http://www.apache.org/licenses/LICENSE-2.0
    
    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.

-->

# Data Type

## Basic Data Type

IoTDB supports the following data types:

* BOOLEAN (Boolean)
* INT32 (Integer)
* INT64 (Long Integer)
* FLOAT (Single Precision Floating Point)
* DOUBLE (Double Precision Floating Point)
* TEXT (String)

### Float Precision

The time series of **FLOAT** and **DOUBLE** type can specify (MAX\_POINT\_NUMBER, see [this page](../Reference/SQL-Reference.md) for more information on how to specify), which is the number of digits after the decimal point of the floating point number, if the encoding method is [RLE](Encoding.md) or [TS\_2DIFF](Encoding.md). If MAX\_POINT\_NUMBER is not specified, the system will use [float\_precision](../Reference/DataNode-Config-Manual.md) in the configuration file `iotdb-common.properties`.

```sql
CREATE TIMESERIES root.vehicle.d0.s0 WITH DATATYPE=FLOAT, ENCODING=RLE, 'MAX_POINT_NUMBER'='2';
```

* For Float data value, The data range is (-Integer.MAX_VALUE, Integer.MAX_VALUE), rather than Float.MAX_VALUE, and the max_point_number is 19, caused by the limition of function Math.round(float) in Java.
* For Double data value, The data range is (-Long.MAX_VALUE, Long.MAX_VALUE), rather than Double.MAX_VALUE, and the max_point_number is 19, caused by the limition of function Math.round(double) in Java (Long.MAX_VALUE=9.22E18).

### Data Type Compatibility

When the written data type is inconsistent with the data type of time-series,
- If the data type of time-series is not compatible with the written data type, the system will give an error message.
- If the data type of time-series is compatible with the written data type, the system will automatically convert the data type.

The compatibility of each data type is shown in the following table:

| Series Data Type | Supported Written Data Types |
|------------------|------------------------------|
| BOOLEAN          | BOOLEAN                      |
| INT32            | INT32                        |
| INT64            | INT32 INT64                  |
| FLOAT            | INT32 FLOAT                  |
| DOUBLE           | INT32 INT64 FLOAT DOUBLE     |
| TEXT             | TEXT                         |

## Timestamp

The timestamp is the time point at which data is produced. It includes absolute timestamps and relative timestamps

### Absolute timestamp

Absolute timestamps in IoTDB are divided into two types: LONG and DATETIME (including DATETIME-INPUT and DATETIME-DISPLAY). When a user inputs a timestamp, he can use a LONG type timestamp or a DATETIME-INPUT type timestamp, and the supported formats of the DATETIME-INPUT type timestamp are shown in the table below:

<div style="text-align: center;">

**Supported formats of DATETIME-INPUT type timestamp**



|            Format            |
| :--------------------------: |
|     yyyy-MM-dd HH:mm:ss      |
|     yyyy/MM/dd HH:mm:ss      |
|     yyyy.MM.dd HH:mm:ss      |
|    yyyy-MM-dd HH:mm:ssZZ     |
|    yyyy/MM/dd HH:mm:ssZZ     |
|    yyyy.MM.dd HH:mm:ssZZ     |
|   yyyy/MM/dd HH:mm:ss.SSS    |
|   yyyy-MM-dd HH:mm:ss.SSS    |
|   yyyy.MM.dd HH:mm:ss.SSS    |
|  yyyy-MM-dd HH:mm:ss.SSSZZ   |
|  yyyy/MM/dd HH:mm:ss.SSSZZ   |
|  yyyy.MM.dd HH:mm:ss.SSSZZ   |
| ISO8601 standard time format |

</div>


IoTDB can support LONG types and DATETIME-DISPLAY types when displaying timestamps. The DATETIME-DISPLAY type can support user-defined time formats. The syntax of the custom time format is shown in the table below:

<div style="text-align: center;">

**The syntax of the custom time format**


| Symbol |           Meaning           | Presentation |              Examples              |
| :----: | :-------------------------: | :----------: | :--------------------------------: |
|   G    |             era             |     era      |                era                 |
|   C    |    century of era (>=0)     |    number    |                 20                 |
|   Y    |      year of era (>=0)      |     year     |                1996                |
|        |                             |              |                                    |
|   x    |          weekyear           |     year     |                1996                |
|   w    |      week of weekyear       |    number    |                 27                 |
|   e    |         day of week         |    number    |                 2                  |
|   E    |         day of week         |     text     |            Tuesday; Tue            |
|        |                             |              |                                    |
|   y    |            year             |     year     |                1996                |
|   D    |         day of year         |    number    |                189                 |
|   M    |        month of year        |    month     |           July; Jul; 07            |
|   d    |        day of month         |    number    |                 10                 |
|        |                             |              |                                    |
|   a    |       halfday of day        |     text     |                 PM                 |
|   K    |   hour of halfday (0~11)    |    number    |                 0                  |
|   h    | clockhour of halfday (1~12) |    number    |                 12                 |
|        |                             |              |                                    |
|   H    |     hour of day (0~23)      |    number    |                 0                  |
|   k    |   clockhour of day (1~24)   |    number    |                 24                 |
|   m    |       minute of hour        |    number    |                 30                 |
|   s    |      second of minute       |    number    |                 55                 |
|   S    |     fraction of second      |    millis    |                978                 |
|        |                             |              |                                    |
|   z    |          time zone          |     text     |     Pacific Standard Time; PST     |
|   Z    |     time zone offset/id     |     zone     | -0800; -08:00; America/Los_Angeles |
|        |                             |              |                                    |
|   '    |       escape for text       |  delimiter   |                                    |
|   ''   |        single quote         |   literal    |                 '                  |

</div>

### Relative timestamp

Relative time refers to the time relative to the server time ```now()``` and ```DATETIME``` time.

 Syntax:

 ```
  Duration = (Digit+ ('Y'|'MO'|'W'|'D'|'H'|'M'|'S'|'MS'|'US'|'NS'))+
  RelativeTime = (now() | DATETIME) ((+|-) Duration)+
        
 ```

  <div style="text-align: center;">

**The syntax of the duration unit**


| Symbol |   Meaning   |       Presentation       | Examples |
| :----: | :---------: | :----------------------: | :------: |
|   y    |    year     |       1y=365 days        |    1y    |
|   mo   |    month    |       1mo=30 days        |   1mo    |
|   w    |    week     |        1w=7 days         |    1w    |
|   d    |     day     |         1d=1 day         |    1d    |
|        |             |                          |          |
|   h    |    hour     |     1h=3600 seconds      |    1h    |
|   m    |   minute    |      1m=60 seconds       |    1m    |
|   s    |   second    |       1s=1 second        |    1s    |
|        |             |                          |          |
|   ms   | millisecond | 1ms=1000_000 nanoseconds |   1ms    |
|   us   | microsecond |   1us=1000 nanoseconds   |   1us    |
|   ns   | nanosecond  |     1ns=1 nanosecond     |   1ns    |

  </div>

  eg：

  ```
  now() - 1d2h //1 day and 2 hours earlier than the current server time
  now() - 1w //1 week earlier than the current server time
  ```

  > Note：There must be spaces on the left and right of '+' and '-'.
