
# 日期/时间类型
DWS支持的日期/时间类型请参见[表1]。该类型的操作符和内置函数请参见[时间日期函数和操作符](https://support.huaweicloud.com/sqlreference-911-dws/dws_06_0035.html)。
![](https://support.huaweicloud.com/sqlreference-911-dws/public_sys-resources/note_3.0-zh-cn.png)
如果其他的数据库时间格式和DWS的时间格式不一致，可通过修改配置参数[DateStyle](https://support.huaweicloud.com/devg-911-dws/dws_04_0926.html#section0)的值来保持一致。
 表1日期/时间类型 
| 名称                                     | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | 存储空间                                                                                |
|:---|:---|:---|
| DATE                                   | Oracle兼容模式下等价于timestamp(0)，记录日期和时间。 其他模式下，记录日期。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | Oracle兼容模式下，占存储空间8字节 其他模式下，占存储空间4字节 |
| TIME \[(p)\] \[WITHOUT TIME ZONE\]     | 只用于一日内时间。 p表示小数点后的精度，取值范围为0\~6。默认精度为6，表示精确到微秒。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | 8字节                                                                                 |
| TIME \[(p)\] \[WITH TIME ZONE\]        | 只用于一日内时间，带时区。 p表示小数点后的精度，取值范围为0\~6。默认精度为6，表示精确到微秒。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | 12字节                                                                                |
| TIMESTAMP\[(p)\] \[WITHOUT TIME ZONE\] | 日期和时间。 p表示小数点后的精度，取值范围为0\~6。默认精度为6，表示精确到微秒。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | 8字节                                                                                 |
| TIMESTAMP\[(p)\]\[WITH TIME ZONE\]     | 日期和时间，带时区。TIMESTAMP的别名为TIMESTAMPTZ。 p表示小数点后的精度，取值范围为0\~6。默认精度为6，表示精确到微秒。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | 8字节                                                                                 |
| SMALLDATETIME                          | 日期和时间，不带时区。 精确到分钟，秒位大于等于30秒进一位。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | 8字节                                                                                 |
| INTERVAL DAY (l) TO SECOND (p)         | 时间间隔，X天X小时X分X秒。 - l：天数的精度，取值范围为0\~6。为适配Oracle语法，未实现具体功能。  - p：秒数的精度，取值范围为0\~6。小数末尾的零不显示。                                                                                                                                                                                                                                                                                                                                                                                                                           | 16字节                                                                                |
| INTERVAL \[FIELDS\] \[ (p) \]          | 时间间隔。 - fields：可以是YEAR，MONTH，DAY，HOUR，MINUTE，SECOND，DAY TO HOUR，DAY TO MINUTE，DAY TO SECOND，HOUR TO MINUTE，HOUR TO SECOND，MINUTE TO SECOND。    - p：秒数的精度，取值范围为0\~6，且fields为SECOND，DAY TO SECOND，HOUR TO SECOND或MINUTE TO SECOND时，参数p才有效。小数末尾的零不显示。 说明： 9.1.0.200及以上集群版本的MySQL兼容性模式下，当fields为YEAR，MONTH，DAY，HOUR，MINUTE，SECOND时，入参可以为不含正负号的整数或浮点数，例如INTERVAL 1 YEAR, INTERVAL 2.5 MONTH等。    | 12字节                                                                                |
| reltime                                | 相对时间间隔。格式为： X years X mons X days XX:XX:XX。 - 采用儒略历计时，规定一年为365.25天，一个月为30天，计算输入值对应的相对时间间隔，输出采用POSTGRES格式。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | 4字节                                                                                 |
   
示例：
```
--创建表。
CREATE TABLE date_type_tab(coll date);
--插入数据。
INSERT INTO date_type_tab VALUES (date '12-10-2010');
--查看数据。
SELECT * FROM date_type_tab;
        coll         
---------------------
 2010-12-10 00:00:00
(1 row)
--删除表。
DROP TABLE date_type_tab;
--创建表。
CREATE TABLE time_type_tab (da time without time zone ,dai time with time zone,dfgh timestamp without time zone,dfga timestamp with time zone, vbg smalldatetime);
--插入数据。
INSERT INTO time_type_tab VALUES ('21:21:21','21:21:21 pst','2010-12-12','2013-12-11 pst','2003-04-12 04:05:06');
--查看数据。
SELECT * FROM time_type_tab;
    da    |     dai     |        dfgh         |          dfga          |         vbg         
----------+-------------+---------------------+------------------------+---------------------
 21:21:21 | 21:21:21-08 | 2010-12-12 00:00:00 | 2013-12-11 16:00:00+08 | 2003-04-12 04:05:00
(1 row)
--删除表。
DROP TABLE time_type_tab;
--创建表。
CREATE TABLE day_type_tab (a int,b INTERVAL DAY(3) TO SECOND (4)); 
--插入数据。
INSERT INTO day_type_tab VALUES (1, INTERVAL '3' DAY);
--查看数据。
SELECT * FROM day_type_tab;
 a |   b    
---+--------
 1 | 3 days
(1 row)
--删除表。
DROP TABLE day_type_tab;
--创建表。
CREATE TABLE year_type_tab(a int, b interval year (6));
--插入数据。
INSERT INTO year_type_tab VALUES(1,interval '2' year);
--查看数据。
SELECT * FROM year_type_tab;
 a |    b    
---+---------
 1 | 2 years
(1 row)
--删除表。
DROP TABLE year_type_tab;
```
#### 日期输入
日期和时间的输入几乎可以是任何合理的格式，包括ISO-8601格式、SQL-兼容格式、传统POSTGRES格式或者其它的形式。系统支持按照日、月、年的顺序自定义日期输入。如果把DateStyle参数设置为MDY就按照"月-日-年"解析，设置为DMY就按照"日-月-年"解析，设置为YMD就按照"年-月-日"解析。
日期的文本输入需要加单引号包围，语法如下：
type \[ ( p ) \] 'value'
可选的精度声明中的p是一个整数，表示在秒域中小数部分的位数。[表2]显示了date类型的输入方式。
 表2日期输入方式 
| 例子               | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
|:---|:---|
| 1999-01-08       | ISO 8601格式（建议格式），任何方式下都是1999年1月8号。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| January 8, 1999  | 在任何datestyle输入模式下都无歧义。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| 1/8/1999         | 有歧义，在MDY模式下是一月八号，在DMY模式下是八月一号。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| 1/18/1999        | MDY模式下是一月十八日，其它模式下被拒绝。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| 01/02/03         | - MDY模式下的2003年1月2日。  - DMY模式下的2003年2月1日。  - YMD模式下的2001年2月3日。   |
| 1999-Jan-08      | 任何模式下都是1月8日。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| Jan-08-1999      | 任何模式下都是1月8日。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| 08-Jan-1999      | 任何模式下都是1月8日。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| 99-Jan-08        | YMD模式下是1月8日，否则错误。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| 08-Jan-99        | 一月八日，除了在YMD模式下是错误的之外。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| Jan-08-99        | 一月八日，除了在YMD模式下是错误的之外。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| 19990108         | ISO 8601；任何模式下都是1999年1月8日。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| 990108           | ISO 8601；任何模式下都是1999年1月8日。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| 1999.008         | 年和年里的第几天。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| J2451187         | 儒略日。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| January 8, 99 BC | 公元前99年。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
   
示例：
```
--创建表。
CREATE TABLE date_type_tab(coll date);
--插入数据。
INSERT INTO date_type_tab VALUES (date '12-10-2010');
--查看数据。
SELECT * FROM date_type_tab;
        coll         
---------------------
 2010-12-10 00:00:00
(1 row)
--查看日期格式。
SHOW datestyle;
 DateStyle 
-----------
 ISO, MDY
(1 row)
--设置日期格式。
SET datestyle='YMD';
SET
--插入数据。
INSERT INTO date_type_tab VALUES(date '2010-12-11');
--查看数据。
SELECT * FROM date_type_tab;
        coll         
---------------------
 2010-12-10 00:00:00
 2010-12-11 00:00:00
(2 rows)
--删除表。
DROP TABLE date_type_tab;
```
#### 时间
时间类型包括time \[ (p) \] without time zone和time \[ (p) \] with time zone。如果只写time等效于time without time zone。
如果在time without time zone类型的输入中声明了时区，则会忽略这个时区。
时间输入类型的详细信息请参见[表3]，时区输入类型的详细信息请参见[表4]。
 表3时间输入 
| 例子             | 描述                     |
|:---|:---|
| 05:06.8        | ISO 8601               |
| 4:05:06        | ISO 8601               |
| 4:05           | ISO 8601               |
| 40506          | ISO 8601               |
| 4:05 AM        | 与04:05一样，AM不影响数值       |
| 4:05 PM        | 与16:05一样，输入小时数必须\<= 12 |
| 04:05:06.789-8 | ISO 8601               |
| 04:05:06-08:00 | ISO 8601               |
| 04:05-08:00    | ISO 8601               |
| 040506-08      | ISO 8601               |
| 04:05:06 PST   | 缩写的时区                  |
   
 表4时区输入 
| 例子    | 描述                             |
|:---|:---|
| PST   | 太平洋标准时间（Pacific Standard Time） |
| -8:00 | ISO 8601与PST的偏移                |
| -800  | ISO 8601与PST的偏移                |
| -8    | ISO 8601与PST的偏移                |
   
示例：
```
SELECT time '04:05:06';
   time   
----------
 04:05:06
(1 row)
SELECT time '04:05:06 PST';
   time   
----------
 04:05:06
(1 row)
SELECT time with time zone '04:05:06 PST';
   timetz    
-------------
 04:05:06-08
(1 row)
```
#### 特殊值
DWS支持几个特殊值，在读取的时候将被转换成普通的日期/时间值，请参考[表5]。
 表5特殊值 
| 输入字符串     | 适用类型                | 描述                                |
|:---|:---|:---|
| epoch     | date，timestamp      | 1970-01-01 00:00:00+00 （Unix系统零时） |
| infinity  | timestamp           | 比任何其他时间戳都晚                        |
| -infinity | timestamp           | 比任何其他时间戳都早                        |
| now       | date，time，timestamp | 当前事务的开始时间                         |
| today     | date，timestamp      | 今日午夜                              |
| tomorrow  | date，timestamp      | 明日午夜                              |
| yesterday | date，timestamp      | 昨日午夜                              |
| allballs  | time                | 00:00:00.00 UTC                   |
   
#### 时间段输入
reltime的输入方式可以采用任何合法的时间段文本格式，包括数字形式（含负数和小数）及时间形式，其中时间形式的输入支持SQL标准格式、ISO-8601格式、POSTGRES格式等。另外，文本输入需要加单引号。
时间段输入的详细信息请参考[表6 时间段输入]。
 表6时间段输入 
| 输入示例                           | 输出结果                                | 描述                                                                                                                         |
|:---|:---|:---|
| 60                             | 2 mons                              | 采用数字表示时间段，默认单位是day，可以是小数或负数。特别的，负数时间段，在语义上，可以理解为"早于多久"。                                                                    |
| 31.25                          | 1 mons 1 days 06:00:00              | 采用数字表示时间段，默认单位是day，可以是小数或负数。特别的，负数时间段，在语义上，可以理解为"早于多久"。                                                                    |
| -365                           | -12 mons -5 days                    | 采用数字表示时间段，默认单位是day，可以是小数或负数。特别的，负数时间段，在语义上，可以理解为"早于多久"。                                                                    |
| 1 years 1 mons 8 days 12:00:00 | 1 years 1 mons 8 days 12:00:00      | 采用POSTGRES格式表示时间段，可以正负混用，不区分大小写，输出结果为将输入时间段计算并转换得到的简化POSTGRES格式时间段。                                                        |
| -13 months -10 hours           | -1 years -25 days -04:00:00         | 采用POSTGRES格式表示时间段，可以正负混用，不区分大小写，输出结果为将输入时间段计算并转换得到的简化POSTGRES格式时间段。                                                        |
| -2 YEARS +5 MONTHS 10 DAYS     | -1 years -6 mons -25 days -06:00:00 | 采用POSTGRES格式表示时间段，可以正负混用，不区分大小写，输出结果为将输入时间段计算并转换得到的简化POSTGRES格式时间段。                                                        |
| P-1.1Y10M                      | -3 mons -5 days -06:00:00           | 采用ISO-8601格式表示时间段，可以正负混用，不区分大小写，输出结果为将输入时间段计算并转换得到的简化POSTGRES格式时间段。  |
| -12H                           | -12:00:00                           | 采用ISO-8601格式表示时间段，可以正负混用，不区分大小写，输出结果为将输入时间段计算并转换得到的简化POSTGRES格式时间段。  |
   
示例：
```
--创建表。
CREATE TABLE reltime_type_tab(col1 character(30), col2 reltime);
--插入数据。
INSERT INTO reltime_type_tab VALUES ('90', '90');
INSERT INTO reltime_type_tab VALUES ('-366', '-366');
INSERT INTO reltime_type_tab VALUES ('1975.25', '1975.25');
INSERT INTO reltime_type_tab VALUES ('-2 YEARS +5 MONTHS 10 DAYS', '-2 YEARS +5 MONTHS 10 DAYS');
INSERT INTO reltime_type_tab VALUES ('30 DAYS 12:00:00', '30 DAYS 12:00:00');
INSERT INTO reltime_type_tab VALUES ('P-1.1Y10M', 'P-1.1Y10M');
--查看数据。
SELECT * FROM reltime_type_tab;
              col1              |                col2                 
--------------------------------+-------------------------------------
 1975.25                        | 5 years 4 mons 29 days
 -2 YEARS +5 MONTHS 10 DAYS     | -1 years -6 mons -25 days -06:00:00
 P-1.1Y10M                      | -3 mons -5 days -06:00:00
 -366                           | -1 years -18:00:00
 90                             | 3 mons
 30 DAYS 12:00:00               | 1 mon 12:00:00
(6 rows)
--删除表。
DROP TABLE reltime_type_tab;
```
