

 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/)。

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

# EXTRACT 函數
<a name="r_EXTRACT_function"></a>

EXTRACT 函式會從 TIMESTAMP、TIMESTAMPTZ、TIME、TIMETZ、INTERVAL YEAR TO MONTH 或 INTERVAL DAY TO SECOND 值傳回日期或時間部分。範例包括時間戳記中的日、月、年、時、分、秒、毫秒或微秒。

## 語法
<a name="r_EXTRACT_function-synopsis"></a>

```
EXTRACT(datepart FROM source)
```

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

 *datepart*   
要擷取的日期或時間的分欄，例如日、月、年、小時、分鐘、秒、毫秒或微秒。對於可能的值，請參閱 [日期或時間戳記函數的日期部分](r_Dateparts_for_datetime_functions.md)。

 *source*   
評估為 TIMESTAMP、TIMESTAMPTZ、TIME、TIMETZ、INTERVAL YEAR TO MONTH 或 INTERVAL DAY TO SECOND 資料類型的欄或表達式。

## 傳回類型
<a name="r_EXTRACT_function-return-type"></a>

如果 *source* 值評估為資料類型 TIMESTAMP、TIME、TIMETZ、INTERVAL YEAR TO MONTH 或 INTERVAL DAY TO SECOND，則為 INTEGER。

如果 *source* 值計算為資料類型 TIMESTAMPTZ，則為 DOUBLE PRECISION。

## TIMESTAMP 範例
<a name="r_EXTRACT_function-examples"></a>

下列範例會判斷特價時，售價是 10,000 USD 或更多的週次。此範例使用 TICKIT 資料。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

```
select salesid, extract(week from saletime) as weeknum
from sales 
where pricepaid > 9999 
order by 2;

salesid | weeknum
--------+---------
 159073 |       6
 160318 |       8
 161723 |      26
```

下列範例會從常值 timestamp 值傳回分鐘值。

```
select extract(minute from timestamp '2009-09-09 12:08:43');
            
date_part
-----------
8
```

下列範例會從常值 timestamp 值傳回毫秒值。

```
select extract(ms from timestamp '2009-09-09 12:08:43.101');
            
date_part
-----------
101
```

## TIMESTAMPTZ 範例
<a name="r_EXTRACT_function-examples-timestamptz"></a>

下列範例會從常值 timestamptz 傳回年份值。

```
select extract(year from timestamptz '1.12.1997 07:37:16.00 PST');
            
date_part
-----------
1997
```

## TIME 範例
<a name="r_EXTRACT_function-examples-time"></a>

下列範例資料表 TIME\$1TEST 有一個 TIME\$1VAL 欄 (類型為 TIME)，其中插入了三個值。

```
select time_val from time_test;
            
time_val
---------------------
20:00:00
00:00:00.5550
00:58:00
```

下列範例會擷取每個 time\$1val 的分鐘。

```
select extract(minute from time_val) as minutes from time_test;
            
minutes
-----------
         0
         0
         58
```

下列範例會擷取每個 time\$1val 中的小時數。

```
select extract(hour from time_val) as hours from time_test;
            
hours
-----------
         20
         0
         0
```

下列範例會從常值值擷取毫秒。

```
select extract(ms from time '18:25:33.123456');
            
 date_part
-----------
     123
```

## TIMETZ 範例
<a name="r_EXTRACT_function-examples-timetz"></a>

下列範例資料表 TIMETZ\$1TEST 有一個 TIMETZ\$1VAL 欄 (類型為 TIMETZ)，其中插入了三個值。

```
select timetz_val from timetz_test;
            
timetz_val
------------------
04:00:00+00
00:00:00.5550+00
05:58:00+00
```

下列範例會擷取每個 timetz\$1val 的小時。

```
select extract(hour from timetz_val) as hours from time_test;
            
hours
-----------
         4
         0
         5
```

下列範例會從常值值擷取毫秒。在處理擷取之前，常值不會轉換為 UTC。

```
select extract(ms from timetz '18:25:33.123456 EST');
            
 date_part
-----------
     123
```

下列範例會從常值 timetz 值傳回 UTC 的時區偏移小時。

```
select extract(timezone_hour from timetz '1.12.1997 07:37:16.00 PDT');
            
date_part
-----------
-7
```

## INTERVAL YEAR TO MONTH 和 INTERVAL DAY TO SECOND 的範例
<a name="r_EXTRACT_function-examples-interval"></a>

下列範例會從定義 36 個小時的 INTERVAL DAY TO SECOND 擷取天部分 `1`，也就是 1 天又 12 小時。

```
select EXTRACT('days' from INTERVAL '36 hours' DAY TO SECOND)
  
 date_part
------------------
 1
```

下列範例會從定義 15 個月的 YEAR TO MONTH 擷取月部分 `3`，也就是 1 年又 3 個月。

```
select EXTRACT('month' from INTERVAL '15 months' YEAR TO MONTH)
  
 date_part
------------------
 3
```

下列範例會從 30 個月擷取月部分 `6`，也就是 2 年又 6 個月。

```
select EXTRACT('month' from INTERVAL '30' MONTH)
   
 date_part
------------------
 6
```

下列範例會從 50 個小時擷取小時部分 `2`，也就是 2 天又 2 小時。

```
select EXTRACT('hours' from INTERVAL '50' HOUR)
  
 date_part
------------------
 2
```

下列範例會從 1 小時 11 分鐘 11.123 秒擷取分鐘部分 `11`。

```
select EXTRACT('minute' from INTERVAL '70 minutes 70.123 seconds' MINUTE TO SECOND)
  
 date_part
------------------
 11
```

下列範例會從 1 天 1 小時 1 分鐘 1.11 秒擷取秒部分 `1.11`。

```
select EXTRACT('seconds' from INTERVAL '1 day 1:1:1.11' DAY TO SECOND)
  
 date_part
------------------
 1.11
```

下列範例會擷取 INTERVAL 中的總時數。每個部分都會擷取並新增至總計。

```
select EXTRACT('days' from INTERVAL '50' HOUR) * 24 + EXTRACT('hours' from INTERVAL '50' HOUR)
 
 ?column?
------------------
 50
```

下列範例會擷取 INTERVAL 中的總秒數。每個部分都會擷取並新增至總計。

```
select EXTRACT('days' from INTERVAL '1 day 1:1:1.11' DAY TO SECOND) * 86400 + 
       EXTRACT('hours' from INTERVAL '1 day 1:1:1.11' DAY TO SECOND) * 3600 +
       EXTRACT('minutes' from INTERVAL '1 day 1:1:1.11' DAY TO SECOND) * 60 + 
       EXTRACT('seconds' from INTERVAL '1 day 1:1:1.11' DAY TO SECOND)
  
 ?column?
------------------
 90061.11
```