

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 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>

以下示例确定支付价格为 10000 美元或更高的销售周数。此示例使用 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
```

以下示例从文本时间戳值返回分钟值。

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

以下示例从文本时间戳值返回毫秒值。

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

## TIMESTAMPZ 示例
<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 小时（即 1 天 12 小时）的 INTERVAL DAY TO SECOND 中提取 `1` 的日部分。

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

以下示例从定义 15 个月（即 1 年 3 个月）的 YEAR TO MONTH 中提取 `3` 的月份部分。

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

以下示例从 30 个月（即 2 年 6 个月）中提取 `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
```