

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 間隔資料類型和常值
<a name="interval_data_types_spark"></a>

您可以使用間隔資料類型來儲存下列單位的持續時間：`seconds`、`minutes`、`hours`、`days`、`months` 和 `years`。間隔資料類型和常值可用於日期時間計算，例如，將間隔新增至日期和時間戳記、加總間隔，以及從日期或時間戳記減去間隔。間隔常值可作為資料表中間隔資料類型欄的輸入值。

## 間隔資料類型的語法
<a name="interval_data_types-syntax"></a>

若要指定間隔資料類型，以年和月為單位儲存持續時間：

```
INTERVAL year_to_month_qualifier
```

若要指定間隔資料類型，以天、小時、分鐘和秒為單位儲存持續時間：

```
INTERVAL day_to_second_qualifier [ (fractional_precision) ]
```

## 間隔常值的語法
<a name="interval_data_types-syntax-literal"></a>

若要指定間隔常值，以年和月為單位定義持續時間：

```
INTERVAL quoted-string year_to_month_qualifier
```

若要指定間隔常值，以天、小時、分鐘和秒為單位定義持續時間：

```
INTERVAL quoted-string day_to_second_qualifier [ (fractional_precision) ]
```

## 引數
<a name="interval_data_types-arguments"></a>

 *quoted-string*   
指定正或負數值，以將數量和日期時間單位指定為輸入字串。如果*引號字串*只包含數字，則 AWS Clean Rooms 會從 *year\_to\_month\_qualifier *或 *day\_to\_second\_qualifier* 判斷單位。例如，`'23' MONTH` 代表 `1 year 11 months`、`'-2' DAY` 代表 `-2 days 0 hours 0 minutes 0.0 seconds`、`'1-2' MONTH` 代表 `1 year 2 months`，以及 `'13 day 1 hour 1 minute 1.123 seconds' SECOND` 代表 `13 days 1 hour 1 minute 1.123 seconds`。如需間隔的輸出格式的詳細資訊，請參閱 [間隔樣式](#interval_data_types-interval-styles)。

 *year\_to\_month\_qualifier*   
指定間隔的範圍。如果您使用限定詞並以小於限定詞的時間單位建立間隔， 會 AWS Clean Rooms 截斷並捨棄間隔的較小部分。*year\_to\_month\_qualifier* 的有效值為：  
+ `YEAR`
+ `MONTH`
+ `YEAR TO MONTH`

 *day\_to\_second\_qualifier*   
指定間隔的範圍。如果您使用限定詞並以小於限定詞的時間單位建立間隔， 會 AWS Clean Rooms 截斷並捨棄間隔的較小部分。*day\_to\_second\_qualifier* 的有效值為：  
+ `DAY`
+ `HOUR`
+ `MINUTE`
+ `SECOND`
+ `DAY TO HOUR`
+ `DAY TO MINUTE`
+ `DAY TO SECOND`
+ `HOUR TO MINUTE`
+ `HOUR TO SECOND`
+ `MINUTE TO SECOND`
INTERVAL 常值的輸出會截斷至指定的最小 INTERVAL 元件。例如，使用 MINUTE 限定詞時， AWS Clean Rooms 會捨棄小於 MINUTE 的時間單位。  

```
select INTERVAL '1 day 1 hour 1 minute 1.123 seconds' MINUTE
```
得到的值會截斷至 `'1 day 01:01:00'`。

 *fractional\_precision*   
這是選用參數，用於指定間隔中允許的小數位數。只有在您的間隔包含 SECOND 時，才應指定 *fractional\_precision* 引數。例如，`SECOND(3)` 會建立只允許三位小數的間隔，例如 1.234 秒。小數最多為 6 位。

當間隔同時指定了 YEAR TO MONTH 和 DAY TO SECOND 部分時，工作階段組態 `interval_forbid_composite_literals` 會決定是否傳回錯誤。

## 間隔算術
<a name="interval_data_types-arithmetic"></a>

您可以使用間隔值搭配其他日期時間值來執行算術運算。下表說明可用的運算，以及每項運算產生的資料類型。

**注意**  
 可以同時產生 `date` 和 `timestamp` 結果的運算會根據方程式中涉及的最小時間單位來進行。例如，當您將 `interval` 新增至 `date` 時，如果是 YEAR TO MONTH 間隔，則結果為 `date`，如果是 DAY TO SECOND 間隔，則結果為時間戳記。

第一個運算元為 `interval` 的運算會針對指定的第二個運算元產生下列結果：


| 運算子 | Date | 時間戳記 | Interval | 數值 | 
| --- | --- | --- | --- | --- | 
| - | N/A | N/A | Interval | N/A | 
| \+ | Date | 日期/時間戳記 | Interval | N/A | 
| \* | N/A | N/A | N/A | Interval | 
| / | N/A | N/A | N/A | Interval | 

第一個運算元為 `date` 的運算會針對指定的第二個運算元產生下列結果：


| 運算子 | Date | 時間戳記 | Interval | 數值 | 
| --- | --- | --- | --- | --- | 
| - | 數值 | Interval | 日期/時間戳記 | Date | 
| \+ | N/A | N/A | N/A | N/A | 

第一個運算元為 `timestamp` 的運算會針對指定的第二個運算元產生下列結果：


| 運算子 | Date | 時間戳記 | Interval | 數值 | 
| --- | --- | --- | --- | --- | 
| - | 數值 | Interval | 時間戳記 | 時間戳記 | 
| \+ | N/A | N/A | N/A | N/A | 

## 間隔樣式
<a name="interval_data_types-interval-styles"></a>
+ `postgres` - 遵循 PostgreSQL 樣式。這是預設值。
+ `postgres_verbose` - 遵循 PostgreSQL 詳細樣式。
+ `sql_standard` - 遵循 SQL 標準間隔常值樣式。

下列命令會將間隔樣式設定為 `sql_standard`。

```
SET IntervalStyle to 'sql_standard';
```

**postgres 輸出格式**

以下是 `postgres` 間隔樣式的輸出格式。每個數值都可以是負數。

```
'<numeric> <unit> [, <numeric> <unit> ...]'
```

```
select INTERVAL '1-2' YEAR TO MONTH::text 

varchar
---------------
1 year 2 mons
```

```
select INTERVAL '1 2:3:4.5678' DAY TO SECOND::text

varchar
------------------
1 day 02:03:04.5678
```

**postgres\_verbose 輸出格式**

postgres\_verbose 語法類似 postgres，但 postgres\_verbose 輸出還包含時間單位。

```
'[@] <numeric> <unit> [, <numeric> <unit> ...] [direction]'
```

```
select INTERVAL '1-2' YEAR TO MONTH::text 

varchar
-----------------
@ 1 year 2 mons
```

```
select INTERVAL '1 2:3:4.5678' DAY TO SECOND::text

varchar
---------------------------
@ 1 day 2 hours 3 mins 4.56 secs
```

**sql\_standard 輸出格式**

間隔年到月的格式設定如下。在間隔之前指定負號表示間隔是負值，並套用至整個間隔。

```
'[-]yy-mm'
```

間隔天到秒的格式設定如下。

```
'[-]dd hh:mm:ss.ffffff'
```

```
SELECT INTERVAL '1-2' YEAR TO MONTH::text 
  
varchar   
-------
1-2
```

```
select INTERVAL '1 2:3:4.5678' DAY TO SECOND::text 

varchar
---------------
1 2:03:04.5678
```

## 間隔資料類型的範例
<a name="interval_data_types-examples"></a>

下列範例示範如何搭配資料表使用 INTERVAL 資料類型。

```
create table sample_intervals (y2m interval month, h2m interval hour to minute);
insert into sample_intervals values (interval '20' month, interval '2 days 1:1:1.123456' day to second);
select y2m::text, h2m::text from sample_intervals;


      y2m      |       h2m      
---------------+-----------------
 1 year 8 mons | 2 days 01:01:00
```

```
update sample_intervals set y2m = interval '2' year where y2m = interval '1-8' year to month;
select * from sample_intervals;

   y2m   |       h2m       
---------+-----------------
 2 years | 2 days 01:01:00
```

```
delete from sample_intervals where h2m = interval '2 1:1:0' day to second;
select * from sample_intervals;

 y2m | h2m 
-----+-----
```

## 間隔常值的範例
<a name="interval_data_types_literals-examples"></a>

下列範例會在間隔樣式設定為 `postgres` 的情況下執行。

下列範例示範如何建立 1 年的 INTERVAL 常值。

```
select INTERVAL '1' YEAR 

intervaly2m
---------------
1 years 0 mons
```

如果您指定的 *quoted-string* 超過限定詞，則會從間隔中截斷剩餘的時間單位。在下列範例中，13 個月的間隔會變成 1 年又 1 個月，但剩餘的 1 個月會因 YEAR 限定詞而被排除。

```
select INTERVAL '13 months' YEAR

intervaly2m
---------------
1 years 0 mons
```

如果您使用的限定詞低於間隔字串，則會將剩餘單位納入。

```
select INTERVAL '13 months' MONTH

intervaly2m
---------------
1 years 1 mons
```

在間隔中指定精確度會將小數位數截斷至指定的精確度。

```
select INTERVAL '1.234567' SECOND (3)

intervald2s
--------------------------------
0 days 0 hours 0 mins 1.235 secs
```

如果您未指定精確度， AWS Clean Rooms 會使用最大精確度 6。

```
select INTERVAL '1.23456789' SECOND

intervald2s
-----------------------------------
0 days 0 hours 0 mins 1.234567 secs
```

下列範例示範如何建立限定範圍的間隔。

```
select INTERVAL '2:2' MINUTE TO SECOND

intervald2s
------------------------------
0 days 0 hours 2 mins 2.0 secs
```

限定詞規定您要指定的單位。例如，即使下列範例使用與上一個範例相同的 '2：2' *引號字串*， 仍會 AWS Clean Rooms 識別它使用不同的時間單位，因為 限定詞。

```
select INTERVAL '2:2' HOUR TO MINUTE

intervald2s
------------------------------
0 days 2 hours 2 mins 0.0 secs
```

每個單位都支援縮寫和複數。例如，`5s`、`5 second` 和 `5 seconds` 是相等的間隔。支援的單位包括年、月、小時、分鐘和秒。

```
select INTERVAL '5s' SECOND

intervald2s
------------------------------
0 days 0 hours 0 mins 5.0 secs
```

```
select INTERVAL '5 HOURS' HOUR

intervald2s
------------------------------
0 days 5 hours 0 mins 0.0 secs
```

```
select INTERVAL '5 h' HOUR

intervald2s
------------------------------
0 days 5 hours 0 mins 0.0 secs
```