

 Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 Python UDF 將繼續正常運作至 2026 年 6 月 30 日。如需詳細資訊，請參閱[部落格文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

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

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

**Topics**
+ [儲存與範圍](#r_Datetime_types-storage-and-ranges)
+ [DATE](#r_Datetime_types-date)
+ [TIME](#r_Datetime_types-time)
+ [TIMETZ](#r_Datetime_types-timetz)
+ [TIMESTAMP](#r_Datetime_types-timestamp)
+ [TIMESTAMPTZ](#r_Datetime_types-timestamptz)
+ [日期時間 (Datetime) 類型範例](r_Examples_with_datetime_types.md)
+ [日期、時間和時間戳記常值](r_Date_and_time_literals.md)
+ [間隔資料類型和常值](r_interval_data_types.md)

日期時間 (Datetime) 資料類型包含 DATE、TIME、TIMETZ、TIMESTAMP 與 TIMESTAMPTZ。

## 儲存與範圍
<a name="r_Datetime_types-storage-and-ranges"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_Datetime_types.html)

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

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

## TIME
<a name="r_Datetime_types-time"></a>

TIME 是 TIME WITHOUT TIME ZONE 的別名。

使用 TIME 資料類型來儲存一天中的時間。

TIME 欄可針對小數秒數，儲存精確度最高 6 位數的數值。

在使用者資料表和 Amazon Redshift 系統資料表中，TIME 值預設皆採用世界標準時間 (UTC)。

## TIMETZ
<a name="r_Datetime_types-timetz"></a>

TIMETZ 是 TIME WITH TIME ZONE 的別名。

使用 TIMETZ 資料類型來儲存具有時區的一天中的時間。

TIMETZ 欄可針對小數秒數，儲存精確度最高 6 位數的數值。

根據預設，TIMTZ 值在使用者資料表和 Amazon Redshift 系統資料表中皆採用 UTC。

## TIMESTAMP
<a name="r_Datetime_types-timestamp"></a>

TIMESTAMP 是 TIMESTAMP WITHOUT TIME ZONE 的別名。

使用 TIMESTAMP 資料類型來儲存完整的時間戳記值，其中包含日期和當日的時間。

TIMESTAMP 欄可針對小數秒數，儲存精確度最高 6 位數的數值。

如果將日期插入 TIMESTAMP 欄，或具有部分時間戳記值的日期，則該值會隱含轉換為完整時間戳記值。此完整時間戳記值對於缺少的小時、分鐘和秒具有預設值 (00)。輸入字串中的時區值會遭到忽略。

根據預設，TIMESTAMP 值在使用者資料表和 Amazon Redshift 系統資料表中皆採用 UTC。

## TIMESTAMPTZ
<a name="r_Datetime_types-timestamptz"></a>

TIMESTAMPTZ 是 TIMESTAMP WITH TIME ZONE 的別名。

使用 TIMESTAMPTZ 資料類型來輸入完整的時間戳記值，其中包含日期、當日的時間和時區。當輸入值包含時區時，Amazon Redshift 會使用時區來將該值轉換為 UTC，並儲存 UTC 值。

若要查看受支援時區名稱的清單，請執行下列命令。

```
select pg_timezone_names();
```

 若要查看受支援時區縮寫的清單，請執行下列命令。

```
select pg_timezone_abbrevs();
```

在 [IANA 時區資料庫](https://www.iana.org/time-zones)中，也提供了關於時區的最新資訊。

下表提供時區格式的範例。


| 格式 | 範例 | 
| --- | --- | 
|  dd mon hh:mi:ss yyyy tz  |  17 Dec 07:37:16 1997 PST   | 
|  mm/dd/yyyy hh:mi:ss.ss tz  |  12/17/1997 07:37:16.00 PST  | 
|  mm/dd/yyyy hh:mi:ss.ss tz  |  12/17/1997 07:37:16.00 美國時間/太平洋時區  | 
|  yyyy-mm-dd hh:mi:ss\$1/-tz  |  1997-12-17 07:37:16-08   | 
| dd.mm.yyyy hh:mi:ss tz |  17.12.1997 07:37:16.00 PST  | 

TIMESTAMPTZ 欄可針對小數秒數，儲存精確度最高 6 位數的數值。

如果將日期插入 TIMESTAMPTZ 欄，或具有部分時間戳記的日期，則該值會隱含轉換為完整時間戳記值。此完整時間戳記值對於缺少的小時、分鐘和秒具有預設值 (00)。

TIMESTAMPTZ 值在使用者資料表中採用 UTC。

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

接下來，您可以找到使用 Amazon Redshift 支援的日期時間類型的範例。

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

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

```
create table datetable (start_date date, end_date date);
```

```
insert into datetable values ('2008-06-01','2008-12-31');

insert into datetable values ('Jun 1,2008','20081231');
```

```
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="r_Examples_with_datetime_types-time-examples"></a>

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

```
create table timetable (start_time time, end_time timetz);
```

```
insert into timetable values ('19:11:19','20:41:19 UTC');
insert into timetable values ('191119', '204119 UTC');
```

```
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="r_Examples_with_datetime_types-timestamp-examples"></a>

如果將日期插入 TIMESTAMP 或 TIMESTAMPTZ 資料欄，則時間會預設為午夜。例如，如果插入常值 `20081231`，則儲存的值為 `2008-12-31 00:00:00`。

若要變更目前工作階段的時區，請利用 [SET](r_SET.md) 指令來設定 [timezone](r_timezone_config.md) 組態參數。

下列範例會插入具有不同格式的時間戳記，並顯示產生的資料表。

```
create table tstamp(timeofday timestamp, timeofdaytz timestamptz);

insert into tstamp values('Jun 1,2008  09:59:59', 'Jun 1,2008 09:59:59 EST' );
insert into tstamp values('Dec 31,2008 18:20','Dec 31,2008 18:20');
insert into tstamp values('Jun 1,2008  09:59:59 EST', 'Jun 1,2008 09:59:59');

SELECT * FROM tstamp;

+---------------------+------------------------+
|      timeofday      |      timeofdaytz       |
+---------------------+------------------------+
| 2008-06-01 09:59:59 | 2008-06-01 14:59:59+00 |
| 2008-12-31 18:20:00 | 2008-12-31 18:20:00+00 |
| 2008-06-01 09:59:59 | 2008-06-01 09:59:59+00 |
+---------------------+------------------------+
```

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

以下是 Amazon Redshift 所支援日期、時間和時間戳記常值的規則。

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

下列輸入日期全都是 DATE 資料類型的有效常值日期值範例，可以載入 Amazon Redshift 資料表中。假設預設 `MDY DateStyle` 模式有效。此模式表示在字串中月份值位於日期值之前，例如 `1999-01-08` 和 `01/02/00`。

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

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_Date_and_time_literals.html)

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

下列輸入時間全都是 TIME 和 TIMETZ 資料類型的有效常值時間值範例，可以載入 Amazon Redshift 資料表中。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_Date_and_time_literals.html)

## 時間戳記
<a name="r_Date_and_time_literals-timestamps"></a>

下列輸入時間戳記全都是 TIMESTAMP 和 TIMESTAMPTZ 資料類型的有效常值時間值範例，可以載入 Amazon Redshift 資料表中。有效的日期常值全都可以和下列的時間常值合併。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_Date_and_time_literals.html)

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

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

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_Date_and_time_literals.html)

下列範例顯示 `now` 和 `today` 如何與 DATEADD 函數搭配使用。

```
select dateadd(day,1,'today');

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

select dateadd(day,1,'now');

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

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

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

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

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

```
INTERVAL year_to_month_qualifier
```

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

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

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

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

```
INTERVAL quoted-string year_to_month_qualifier
```

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

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

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

 *quoted-string*   
指定正或負數值，以將數量和日期時間單位指定為輸入字串。如果 *quoted-string* 只包含數值，則 Amazon Redshift 會從 *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`。如需間隔的輸出格式的詳細資訊，請參閱 [間隔樣式](#r_interval_data_types-interval-styles)。

 *year\$1to\$1month\$1qualifier*   
指定間隔的範圍。如果您使用限定詞並以小於限定詞的時間單位建立間隔，Amazon Redshift 會截斷並捨棄間隔的較小部分。*year\$1to\$1month\$1qualifier* 的有效值為：  
+ `YEAR`
+ `MONTH`
+ `YEAR TO MONTH`

 *day\$1to\$1second\$1qualifier*   
指定間隔的範圍。如果您使用限定詞並以小於限定詞的時間單位建立間隔，Amazon Redshift 會截斷並捨棄間隔的較小部分。*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 限定詞時，Amazon Redshift 會捨棄小於 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` 會決定是否傳回錯誤。如需詳細資訊，請參閱[interval\$1forbid\$1composite\$1literals](r_interval_forbid_composite_literals.md)。

## 間隔算術
<a name="r_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/redshift/latest/dg/r_interval_data_types.html)

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

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_interval_data_types.html)

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

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_interval_data_types.html)

## 間隔樣式
<a name="r_interval_data_types-interval-styles"></a>

您可以使用 SQL [SET](r_SET.md) 命令來變更間隔值的輸出顯示格式。當您在 SQL 中使用間隔資料類型時，請將其轉換為文字，以查看預期的間隔樣式，例如 `YEAR TO MONTH::text`。設定 (SET) `IntervalStyle` 的可用值為：
+ `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="r_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="r_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
```

如果您未指定精確度，Amazon Redshift 會使用最大精確度 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' *quoted-string*，Amazon Redshift 仍會因為限定詞的關係，將其辨識為使用不同的時間單位。

```
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="r_interval_literals"></a>

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