

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

# 日期時間 (Datetime) 類型
<a name="Datetime_types"></a>

日期時間資料類型包括 DATE、TIME、TIMESTAMP\$1LTZ 和 TIMESTAMP\$1NTZ。

**Topics**
+ [DATE](Datetime_types-date.md)
+ [TIMESTAMP\$1LTZ](Datetime_types-timestamp_LTZ.md)
+ [TIMESTAMP\$1NTZ](Datetime_types-TIMESTAMP_NTZ.md)
+ [日期時間 (Datetime) 類型範例](Examples_with_datetime_types.md)
+ [日期、時間和時間戳記常值](Date_and_time_literals.md)
+ [間隔常值](Interval_literals.md)
+ [間隔資料類型和常值](interval_data_types_spark.md)

# DATE
<a name="Datetime_types-date"></a>

使用 DATE 資料類型來儲存不含時間戳記的簡單日曆日期。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/clean-rooms/latest/sql-reference/Datetime_types-date.html)

# TIMESTAMP\$1LTZ
<a name="Datetime_types-timestamp_LTZ"></a>

使用 TIMESTAMP\$1LTZ 資料類型來存放完整的時間戳記值，包括日期、日期時間和本機時區。

TIMESTAMP 代表包含欄位 `year`、`month`、、`minute`、 `day` `hour`和 的值`second`，具有工作階段本機時區。此`timestamp`值代表絕對時間點。

Spark 中的 TIMESTAMP 是使用者指定的別名，與其中一個 TIMESTAMP\$1LTZ 和 TIMESTAMP\$1NTZ 變化相關聯。您可以透過組態 將預設時間戳記類型設定為 TIMESTAMP\$1LTZ （預設值） 或 TIMESTAMP\$1NTZ`spark.sql.timestampType`。

# TIMESTAMP\$1NTZ
<a name="Datetime_types-TIMESTAMP_NTZ"></a>

使用 TIMESTAMP\$1NTZ 資料類型來存放完整的時間戳記值，其中包含日期、一天中的時間，不含本機時區。

TIMESTAMP `day`代表包含欄位 `year`、`month`、、`hour`、 `minute`和 值的值`second`。所有操作都會執行，而不會考慮任何時區。

Spark 中的 TIMESTAMP 是使用者指定的別名，與其中一個 TIMESTAMP\$1LTZ 和 TIMESTAMP\$1NTZ 變化相關聯。您可以透過組態 將預設時間戳記類型設定為 TIMESTAMP\$1LTZ （預設值） 或 TIMESTAMP\$1NTZ`spark.sql.timestampType`。

# 日期時間 (Datetime) 類型範例
<a name="Examples_with_datetime_types"></a>

下列範例示範如何使用 支援的日期時間類型 AWS Clean Rooms。

## 日期範例
<a name="Examples_with_datetime_types-date-examples"></a>

以下範例插入具有不同格式的日期並顯示輸出。

```
select * from datetable order by 1;

start_date |  end_date
-----------------------
2008-06-01 | 2008-12-31
2008-06-01 | 2008-12-31
```

如果將時間戳記值插入 DATE 資料欄，會略過時間的部分，只載入日期。

## 時間範例
<a name="Examples_with_datetime_types-time-examples"></a>

以下範例插入具有不同格式的 TIME 和 TIMETZ 值並顯示輸出。

```
select * from timetable order by 1;
start_time |  end_time
------------------------
 19:11:19  | 20:41:19+00
 19:11:19  | 20:41:19+00
```

# 日期、時間和時間戳記常值
<a name="Date_and_time_literals"></a>

以下是使用 AWS Clean Rooms Spark SQL 支援之日期、時間和時間戳記常值的規則。

## 日期
<a name="Date_and_time_literals-dates"></a>

下表顯示輸入日期，這些日期是您可以載入 AWS Clean Rooms 資料表的常值日期值的有效範例。假設預設 `MDY DateStyle` 模式有效。此模式表示在字串中月份值位於日期值之前，例如 `1999-01-08` 和 `01/02/00`。

**注意**  
載入資料表時，日期或時間戳記常值必須用引號括住。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/clean-rooms/latest/sql-reference/Date_and_time_literals.html)

## Times
<a name="Date_and_time_literals-times"></a>

下表顯示您可以載入 AWS Clean Rooms 資料表之常值時間值的有效範例輸入時間。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/clean-rooms/latest/sql-reference/Date_and_time_literals.html)

## 特殊的日期時間 (Datetime) 值
<a name="Date_and_time_literals-special-datetime-values"></a>

下表顯示可用作日期時間常值和用作日期函數引數的特殊值。這些值需使用單引號，而且會在查詢處理作業進行期間，轉換為一般的時間戳記值。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/clean-rooms/latest/sql-reference/Date_and_time_literals.html)

下列範例示範 `now`和 如何使用 `today` DATE\$1ADD 函數。

```
select date_add('today', 1);

date_add
---------------------
2009-11-17 00:00:00
(1 row)

select date_add('now', 1);

date_add
----------------------------
2009-11-17 10:45:32.021394
(1 row)
```

# 間隔常值
<a name="Interval_literals"></a>

以下是使用 Spark SQL 支援的 AWS Clean Rooms 間隔常值的規則。

使用間隔常值來表示指定的時間期間，例如 `12 hours` 或 `6 weeks`。您可以在需要表示日期時間的條件和表達式中，使用這些間隔常值。

**注意**  
您無法對 AWS Clean Rooms 資料表中的資料欄使用 INTERVAL 資料類型。

 間隔的表示方式，是結合 INTERVAL 關鍵字、數量和支援的日期部分，例如 `INTERVAL '7 days'` 或 `INTERVAL '59 minutes'`。您可以串連幾個數量和單位，來組成更精確的間隔時間，例如：`INTERVAL '7 days, 3 hours, 59 minutes'`。也支援每種單位的縮寫和複數，例如 `5 s`、`5 second` 和 `5 seconds` 是相同的間隔時間。

如果未指定日期部分，則間隔值代表秒。您可以指定小數格式的數量值 (例如：`0.5 days`)。

## 範例
<a name="section_interval-literals-examples"></a>

下列範例顯示不同間隔值的一連串計算。

下列範例會將 1 秒新增至指定的日期。

```
select caldate + interval '1 second' as dateplus from date
where caldate='12-31-2008';
dateplus
---------------------
2008-12-31 00:00:01
(1 row)
```

下列範例會將 1 分鐘新增至指定的日期。

```
select caldate + interval '1 minute' as dateplus from date
where caldate='12-31-2008';
dateplus
---------------------
2008-12-31 00:01:00
(1 row)
```

下列範例會將 3 小時 35 分鐘新增至指定的日期。

```
select caldate + interval '3 hours, 35 minutes' as dateplus from date
where caldate='12-31-2008';
dateplus
---------------------
2008-12-31 03:35:00
(1 row)
```

下列範例會將 52 週新增至指定的日期。

```
select caldate + interval '52 weeks' as dateplus from date
where caldate='12-31-2008';
dateplus
---------------------
2009-12-30 00:00:00
(1 row)
```

下列範例會將 1 週、1 小時、1 分鐘和 1 秒新增至指定的日期。

```
select caldate + interval '1w, 1h, 1m, 1s' as dateplus from date
where caldate='12-31-2008';
dateplus
---------------------
2009-01-07 01:01:01
(1 row)
```

下列範例會將 12 小時 （半天） 新增至指定的日期。

```
select caldate + interval '0.5 days' as dateplus from date
where caldate='12-31-2008';
dateplus
---------------------
2008-12-31 12:00:00
(1 row)
```

下列範例從 2023 年 3 月 31 日減去 4 個月，結果為 2022 年 11 月 30 日。計算有將一個月中的天數納入考量。

```
select date '2023-03-31' - interval '4 months';

?column?
---------------------
2022-11-30 00:00:00
```



# 間隔資料類型和常值
<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\$1to\$1month\$1qualifier *或 *day\$1to\$1second\$1qualifier* 判斷單位。例如，`'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\$1to\$1month\$1qualifier*   
指定間隔的範圍。如果您使用限定詞並以小於限定詞的時間單位建立間隔， 會 AWS Clean Rooms 截斷並捨棄間隔的較小部分。*year\$1to\$1month\$1qualifier* 的有效值為：  
+ `YEAR`
+ `MONTH`
+ `YEAR TO MONTH`

 *day\$1to\$1second\$1qualifier*   
指定間隔的範圍。如果您使用限定詞並以小於限定詞的時間單位建立間隔， 會 AWS Clean Rooms 截斷並捨棄間隔的較小部分。*day\$1to\$1second\$1qualifier* 的有效值為：  
+ `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\$1precision*   
這是選用參數，用於指定間隔中允許的小數位數。只有在您的間隔包含 SECOND 時，才應指定 *fractional\$1precision* 引數。例如，`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` 的運算會針對指定的第二個運算元產生下列結果：

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/clean-rooms/latest/sql-reference/interval_data_types_spark.html)

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

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/clean-rooms/latest/sql-reference/interval_data_types_spark.html)

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

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/clean-rooms/latest/sql-reference/interval_data_types_spark.html)

## 間隔樣式
<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\$1verbose 輸出格式**

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

```
'[@] <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\$1standard 輸出格式**

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

```
'[-]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
```

# 未使用限定詞語法的間隔常值範例
<a name="interval_literals_examples"></a>

**注意**  
下列範例示範使用未包含 `YEAR TO MONTH` 或 `DAY TO SECOND` 限定詞的間隔常值。如需使用包含限定詞的建議間隔常值的相關資訊，請參閱 [間隔資料類型和常值](interval_data_types_spark.md)。

使用間隔常值來表示指定的時間期間，例如 `12 hours` 或 `6 months`。您可以在需要表示日期時間的條件和表達式中，使用這些間隔常值。

 間隔常值的表示方式，是結合 INTERVAL 關鍵字、數量和支援的日期部分，例如 `INTERVAL '7 days'` 或 `INTERVAL '59 minutes'`。您可以串連幾個數量和單位，來組成更精確的間隔時間，例如：`INTERVAL '7 days, 3 hours, 59 minutes'`。也支援每種單位的縮寫和複數，例如 `5 s`、`5 second` 和 `5 seconds` 是相同的間隔時間。

如果未指定日期部分，則間隔值代表秒。您可以指定小數格式的數量值 (例如：`0.5 days`)。

下列範例顯示不同間隔值的一連串計算。

以下內容為指定日期增加 1 秒。

```
select caldate + interval '1 second' as dateplus from date
where caldate='12-31-2008';
dateplus
---------------------
2008-12-31 00:00:01
(1 row)
```

以下內容為指定日期增加 1 分鐘。

```
select caldate + interval '1 minute' as dateplus from date
where caldate='12-31-2008';
dateplus
---------------------
2008-12-31 00:01:00
(1 row)
```

以下內容為指定日期增加 3 個小時又 35 分鐘。

```
select caldate + interval '3 hours, 35 minutes' as dateplus from date
where caldate='12-31-2008';
dateplus
---------------------
2008-12-31 03:35:00
(1 row)
```

以下內容為指定日期增加 52 週。

```
select caldate + interval '52 weeks' as dateplus from date
where caldate='12-31-2008';
dateplus
---------------------
2009-12-30 00:00:00
(1 row)
```

以下內容為指定日期增加 1 週 1 小時 1 分鐘又 1 秒。

```
select caldate + interval '1w, 1h, 1m, 1s' as dateplus from date
where caldate='12-31-2008';
dateplus
---------------------
2009-01-07 01:01:01
(1 row)
```

以下內容為指定指定日期增加 12 個小時 (半天)。

```
select caldate + interval '0.5 days' as dateplus from date
where caldate='12-31-2008';
dateplus
---------------------
2008-12-31 12:00:00
(1 row)
```

以下內容從 2023 年 2 月 15 日減去 4 個月，結果是 2022 年 10 月 15 日。

```
select date '2023-02-15' - interval '4 months';

?column?
---------------------
2022-10-15 00:00:00
```

以下內容從 2023 年 3 月 31 日減去 4 個月，結果是 2022 年 11 月 30 日。計算有將一個月中的天數納入考量。

```
select date '2023-03-31' - interval '4 months';

?column?
---------------------
2022-11-30 00:00:00
```