网络
虚拟私有云 VPC
弹性公网IP EIP
弹性负载均衡 ELB
NAT网关 NAT
云专线 DC
虚拟专用网络 VPN
云连接 CC
VPC终端节点 VPCEP
企业路由器 ER
企业交换机 ESW
全球加速 GA
企业连接 EC
云原生应用网络 ANC
安全与合规
安全技术与应用
Web应用防火墙 WAF
企业主机安全 HSS
云防火墙 CFW
安全云脑 SecMaster
DDoS防护 AAD
数据加密服务 DEW
数据库安全服务 DBSS
云堡垒机 CBH
数据安全中心 DSC
云证书管理服务 CCM
威胁检测服务 MTD
态势感知 SA
认证测试中心 CTC
边缘安全 EdgeSec
应用中间件
微服务引擎 CSE
分布式消息服务Kafka版
分布式消息服务RabbitMQ版
分布式消息服务RocketMQ版
API网关 APIG
分布式缓存服务 DCS
多活高可用服务 MAS
事件网格 EG
管理与监管
统一身份认证服务 IAM
消息通知服务 SMN
云监控服务 CES
应用运维管理 AOM
应用性能管理 APM
云日志服务 LTS
云审计服务 CTS
标签管理服务 TMS
配置审计 Config
应用身份管理服务 OneAccess
资源访问管理 RAM
组织 Organizations
资源编排服务 RFS
优化顾问 OA
IAM 身份中心
云运维中心 COC
资源治理中心 RGC
解决方案
高性能计算 HPC
SAP
混合云灾备
开天工业工作台 MIW
Haydn解决方案工厂
数字化诊断治理专家服务
云生态
云商店
合作伙伴中心
华为云开发者学堂
华为云慧通差旅
开发与运维
软件开发生产线 CodeArts
需求管理 CodeArts Req
流水线 CodeArts Pipeline
代码检查 CodeArts Check
编译构建 CodeArts Build
部署 CodeArts Deploy
测试计划 CodeArts TestPlan
制品仓库 CodeArts Artifact
移动应用测试 MobileAPPTest
CodeArts IDE Online
开源镜像站 Mirrors
性能测试 CodeArts PerfTest
应用管理与运维平台 ServiceStage
云应用引擎 CAE
开源治理服务 CodeArts Governance
华为云Astro轻应用
CodeArts IDE
Astro工作流 AstroFlow
代码托管 CodeArts Repo
漏洞管理服务 CodeArts Inspector
联接 CodeArtsLink
软件建模 CodeArts Modeling
Astro企业应用 AstroPro
CodeArts盘古助手
华为云Astro大屏应用
计算
弹性云服务器 ECS
Flexus云服务
裸金属服务器 BMS
云手机服务器 CPH
专属主机 DeH
弹性伸缩 AS
镜像服务 IMS
函数工作流 FunctionGraph
云耀云服务器(旧版)
VR云渲游平台 CVR
Huawei Cloud EulerOS
云化数据中心 CloudDC
网络
虚拟私有云 VPC
弹性公网IP EIP
弹性负载均衡 ELB
NAT网关 NAT
云专线 DC
虚拟专用网络 VPN
云连接 CC
VPC终端节点 VPCEP
企业路由器 ER
企业交换机 ESW
全球加速 GA
企业连接 EC
云原生应用网络 ANC
CDN与智能边缘
内容分发网络 CDN
智能边缘云 IEC
智能边缘平台 IEF
CloudPond云服务
安全与合规
安全技术与应用
Web应用防火墙 WAF
企业主机安全 HSS
云防火墙 CFW
安全云脑 SecMaster
DDoS防护 AAD
数据加密服务 DEW
数据库安全服务 DBSS
云堡垒机 CBH
数据安全中心 DSC
云证书管理服务 CCM
威胁检测服务 MTD
态势感知 SA
认证测试中心 CTC
边缘安全 EdgeSec
大数据
MapReduce服务 MRS
数据湖探索 DLI
表格存储服务 CloudTable
可信智能计算服务 TICS
推荐系统 RES
云搜索服务 CSS
数据可视化 DLV
数据接入服务 DIS
数据仓库服务 GaussDB(DWS)
数据治理中心 DataArts Studio
湖仓构建 LakeFormation
智能数据洞察 DataArts Insight
应用中间件
微服务引擎 CSE
分布式消息服务Kafka版
分布式消息服务RabbitMQ版
分布式消息服务RocketMQ版
API网关 APIG
分布式缓存服务 DCS
多活高可用服务 MAS
事件网格 EG
开天aPaaS
应用平台 AppStage
开天企业工作台 MSSE
开天集成工作台 MSSI
API中心 API Hub
云消息服务 KooMessage
交换数据空间 EDS
云地图服务 KooMap
云手机服务 KooPhone
组织成员账号 OrgID
云空间服务 KooDrive
管理与监管
统一身份认证服务 IAM
消息通知服务 SMN
云监控服务 CES
应用运维管理 AOM
应用性能管理 APM
云日志服务 LTS
云审计服务 CTS
标签管理服务 TMS
配置审计 Config
应用身份管理服务 OneAccess
资源访问管理 RAM
组织 Organizations
资源编排服务 RFS
优化顾问 OA
IAM 身份中心
云运维中心 COC
资源治理中心 RGC
区块链
区块链服务 BCS
数字资产链 DAC
华为云区块链引擎服务 HBS
解决方案
高性能计算 HPC
SAP
混合云灾备
开天工业工作台 MIW
Haydn解决方案工厂
数字化诊断治理专家服务
价格
成本优化最佳实践
专属云商业逻辑
云生态
云商店
合作伙伴中心
华为云开发者学堂
华为云慧通差旅
其他
管理控制台
消息中心
产品价格详情
系统权限
客户关联华为云合作伙伴须知
公共问题
宽限期保留期
奖励推广计划
活动
云服务信任体系能力说明
开发与运维
软件开发生产线 CodeArts
需求管理 CodeArts Req
流水线 CodeArts Pipeline
代码检查 CodeArts Check
编译构建 CodeArts Build
部署 CodeArts Deploy
测试计划 CodeArts TestPlan
制品仓库 CodeArts Artifact
移动应用测试 MobileAPPTest
CodeArts IDE Online
开源镜像站 Mirrors
性能测试 CodeArts PerfTest
应用管理与运维平台 ServiceStage
云应用引擎 CAE
开源治理服务 CodeArts Governance
华为云Astro轻应用
CodeArts IDE
Astro工作流 AstroFlow
代码托管 CodeArts Repo
漏洞管理服务 CodeArts Inspector
联接 CodeArtsLink
软件建模 CodeArts Modeling
Astro企业应用 AstroPro
CodeArts盘古助手
华为云Astro大屏应用
存储
对象存储服务 OBS
云硬盘 EVS
云备份 CBR
高性能弹性文件服务 SFS Turbo
弹性文件服务 SFS
存储容灾服务 SDRS
云硬盘备份 VBS
云服务器备份 CSBS
数据快递服务 DES
云存储网关 CSG
专属分布式存储服务 DSS
数据工坊 DWR
地图数据 MapDS
键值存储服务 KVS
容器
云容器引擎 CCE
云容器实例 CCI
容器镜像服务 SWR
云原生服务中心 OSC
应用服务网格 ASM
华为云UCS
数据库
云数据库 RDS
数据复制服务 DRS
文档数据库服务 DDS
分布式数据库中间件 DDM
云数据库 GaussDB
云数据库 GeminiDB
数据管理服务 DAS
数据库和应用迁移 UGO
云数据库 TaurusDB
人工智能
AI开发平台ModelArts
华为HiLens
图引擎服务 GES
图像识别 Image
文字识别 OCR
自然语言处理 NLP
内容审核 Moderation
图像搜索 ImageSearch
医疗智能体 EIHealth
企业级AI应用开发专业套件 ModelArts Pro
人脸识别服务 FRS
对话机器人服务 CBS
语音交互服务 SIS
人证核身服务 IVS
视频智能分析服务 VIAS
城市智能体
自动驾驶云服务 Octopus
盘古大模型 PanguLargeModels
IoT物联网
设备接入 IoTDA
全球SIM联接 GSL
IoT数据分析 IoTA
路网数字化服务 DRIS
IoT边缘 IoTEdge
设备发放 IoTDP
企业应用
域名注册服务 Domains
云解析服务 DNS
企业门户 EWP
ICP备案
商标注册
华为云WeLink
华为云会议 Meeting
隐私保护通话 PrivateNumber
语音通话 VoiceCall
消息&短信 MSGSMS
云管理网络
SD-WAN 云服务
边缘数据中心管理 EDCM
云桌面 Workspace
应用与数据集成平台 ROMA Connect
ROMA资产中心 ROMA Exchange
API全生命周期管理 ROMA API
政企自服务管理 ESM
视频
实时音视频 SparkRTC
视频直播 Live
视频点播 VOD
媒体处理 MPC
视频接入服务 VIS
数字内容生产线 MetaStudio
迁移
主机迁移服务 SMS
对象存储迁移服务 OMS
云数据迁移 CDM
迁移中心 MGC
专属云
专属计算集群 DCC
开发者工具
SDK开发指南
API签名指南
DevStar
华为云命令行工具服务 KooCLI
Huawei Cloud Toolkit
CodeArts API
云化转型
云架构中心
云采用框架
用户服务
账号中心
费用中心
成本中心
资源中心
企业管理
工单管理
客户运营能力
国际站常见问题
支持计划
专业服务
合作伙伴支持计划
我的凭证
华为云公共事业服务云平台
工业软件
工业数字模型驱动引擎
硬件开发工具链平台云服务
工业数据转换引擎云服务

时间和日期处理函数和操作符

更新时间:2025-01-22 GMT+08:00
分享

时间日期操作符

时间日期操作符请参见表1

说明:

要尽量避免在查询中使用 'now'::date、'now'::timestamp、'now'::timestamptz字符串常量强转以及text_date('now')的类似表达式来获取数据库当前时间或者将当前时间值作为函数入参场景,在这些场景下,优化器会提前算出常量时间,造成查询结果不正确。

gaussdb=# EXPLAIN SELECT * FROM t1 WHERE b='now'::date;
QUERY PLAN
-----------------------------------------------------
Seq Scan on t1  (cost=0.00..13.60 rows=1 width=310)
Filter: ((b)::text = '2024-11-09 15:07:56'::text)
(2 rows)
gaussdb=# EXPLAIN SELECT * FROM t1 WHERE b=text_date('now');
QUERY PLAN
-----------------------------------------------------
Seq Scan on t1  (cost=0.00..13.60 rows=1 width=310)
Filter: ((b)::text = '2024-11-09'::text)
(2 rows)

推荐使用now()、currenttimestamp()函数作为获取数据库当前时间的方法。

gaussdb=# EXPLAIN SELECT * FROM t1 WHERE b=now();
QUERY PLAN
-----------------------------------------------------
Seq Scan on t1  (cost=0.00..14.80 rows=1 width=310)
Filter: ((b)::text = (now())::text)
(2 rows)
gaussdb=# EXPLAIN SELECT * FROM t1 WHERE b=text_date(now());
QUERY PLAN
----------------------------------------------------------
Seq Scan on t1  (cost=0.00..16.00 rows=1 width=310)
Filter: ((b)::text = (text_date((now())::text))::text)
(2 rows)

用户在使用时间和日期操作符时,对应的操作数请使用明确的类型前缀修饰,以确保数据库在解析操作数的时候能够与用户预期一致,不会产生用户非预期的结果。

比如下面示例没有明确数据类型就会出现异常错误。

1
SELECT date '2001-10-01' - '7' AS RESULT;
表1 时间和日期操作符

操作符

示例

+

1
2
3
4
5
gaussdb=# SELECT date '2001-9-28' + integer '7' AS RESULT;
   result
------------
 2001-10-05
(1 row)
说明:

在A兼容模式下,查询结果为2001-10-05 00:00:00。

1
2
3
4
5
gaussdb=# SELECT date '2001-09-28' + interval '1 hour' AS RESULT;
       result        
---------------------
 2001-09-28 01:00:00
(1 row)
1
2
3
4
5
gaussdb=# SELECT date '2001-09-28' + time '03:00' AS RESULT;
       result        
---------------------
 2001-09-28 03:00:00
(1 row)
1
2
3
4
5
gaussdb=# SELECT interval '1 day' + interval '1 hour' AS RESULT;
     result     
----------------
 1 day 01:00:00
(1 row)
1
2
3
4
5
gaussdb=# SELECT timestamp '2001-09-28 01:00' + interval '23 hours' AS RESULT;
       result        
---------------------
 2001-09-29 00:00:00
(1 row)
1
2
3
4
5
gaussdb=# SELECT time '01:00' + interval '3 hours' AS RESULT;
  result  
----------
 04:00:00
(1 row)

-

1
2
3
4
5
gaussdb=# SELECT date '2001-10-01' - date '2001-09-28' AS RESULT;
 result
--------
 3days
(1 row)
1
2
3
4
5
gaussdb=# SELECT date '2001-10-01' - integer '7' AS RESULT;
       result        
---------------------
 2001-09-24 00:00:00
(1 row)
1
2
3
4
5
gaussdb=# SELECT date '2001-09-28' - interval '1 hour' AS RESULT;
       result        
---------------------
 2001-09-27 23:00:00
(1 row)
1
2
3
4
5
gaussdb=# SELECT time '05:00' - time '03:00' AS RESULT;
  result  
----------
 02:00:00
(1 row)
1
2
3
4
5
gaussdb=# SELECT time '05:00' - interval '2 hours' AS RESULT;
  result  
----------
 03:00:00
(1 row)
1
2
3
4
5
gaussdb=# SELECT timestamp '2001-09-28 23:00' - interval '23 hours' AS RESULT;
       result        
---------------------
 2001-09-28 00:00:00
(1 row)
1
2
3
4
5
gaussdb=# SELECT interval '1 day' - interval '1 hour' AS RESULT;
  result  
----------
 23:00:00
(1 row)
1
2
3
4
5
gaussdb=# SELECT timestamp '2001-09-29 03:00' - timestamp '2001-09-27 12:00' AS RESULT;
     result     
----------------
 1 day 15:00:00
(1 row)

*

1
2
3
4
5
gaussdb=# SELECT 900 * interval '1 second' AS RESULT;
  result  
----------
 00:15:00
(1 row)
1
2
3
4
5
gaussdb=# SELECT 21 * interval '1 day' AS RESULT;
 result  
---------
 21 days
(1 row)
1
2
3
4
5
gaussdb=# SELECT double precision '3.5' * interval '1 hour' AS RESULT;
  result  
----------
 03:30:00
(1 row)

/

1
2
3
4
5
gaussdb=# SELECT interval '1 hour' / double precision '1.5' AS RESULT;
  result  
----------
 00:40:00
(1 row)

时间/日期函数

  • age(timestamp, timestamp)

    描述:将两个参数相减,并以年、月、日作为返回值。若相减值为负,则函数返回亦为负,入参可以都带timezone或都不带timezone。

    返回值类型:interval

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT age(timestamp '2001-04-10', timestamp '1957-06-13');
               age           
    -------------------------
     43 years 9 mons 27 days
    (1 row)
    
  • age(timestamp)

    描述:当前SQL执行开始时刻的系统时间和参数相减,入参可以带或者不带timezone。

    返回值类型:interval

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT age(timestamp '1957-06-13');
               age           
    -------------------------
     60 years 2 mons 18 days
    (1 row)
    
  • clock_timestamp()

    描述:返回当前函数被调用时的系统时间的时间戳。volatile函数,每次扫描都会取最新的时间戳,因此在一次查询中每次调用结果不相同。

    返回值类型:timestamp with time zone

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT clock_timestamp();
            clock_timestamp        
    -------------------------------
     2017-09-01 16:57:36.636205+08
    (1 row)
    
  • current_date

    描述:返回当前本条SQL启动的系统时间的日期。

    返回值类型:date

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT current_date;
        date    
    ------------
     2017-09-01
    (1 row)
    
    说明:

    此函数在A兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s2的情况下返回值类型为timestamp。

  • current_time

    描述:当前事务的开始时刻的系统时间。

    返回值类型:time with time zone

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT current_time;
           timetz       
    --------------------
     16:58:07.086215+08
    (1 row)
    
  • current_timestamp

    描述:返回的结果为当前SQL启动的系统时间。在PL/SQL中,简单的赋值语句如:time1 := current_timestamp,被认为是表达式,所以会返回上一条SQL语句启动时间。

    返回值类型:timestamp with time zone

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT current_timestamp;
           pg_systimestamp        
    ------------------------------
     2017-09-01 16:58:19.22173+08
    (1 row)
    
  • current_timestamp(precision)

    描述:返回的结果为当前事务启动的系统时间,并将结果的微秒圆整为指定小数位。

    返回值类型:timestamp with time zone

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT current_timestamp(1);
           timestamptz            
    ------------------------------
     2017-09-01 16:58:19.2+08
    (1 row)
    
    说明:
    • 此函数在A兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s2的情况下,precision参数支持numeric类型的整值,否则仅支持int输入。
    • 微秒末位的0不显示。如 2017-09-01 10:32:19.212000 输出显示为 2017-09-01 10:32:19.212。
  • pg_systimestamp()

    描述:当前日期和时间(当前语句的开始)。

    返回值类型:timestamp with time zone

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT pg_systimestamp();
            pg_systimestamp
    -------------------------------
     2015-10-14 11:21:28.317367+08
    (1 row)
    
  • date_part(text, timestamp)

    描述:获取日期/时间值中子域的值,例如年或者小时的值。等效于extract(field from timestamp)。

    timestamp类型:abstime、date、interval、reltime、time with time zone、time without time zone、timestamp with time zone、timestamp without time zone。

    返回值类型:double precision

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT date_part('hour', timestamp '2001-02-16 20:38:40');
     date_part 
    -----------
            20
    (1 row)
    
  • date_part(text, interval)

    描述:获取日期/时间值中子域的值。获取月份值时,如果月份值大于12,则取与12的模。等效于extract(field from timestamp)。

    返回值类型:double precision

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT date_part('month', interval '2 years 3 months');
     date_part 
    -----------
             3
    (1 row)
    
  • date_trunc(text, timestamp)

    描述:截取到参数text指定的精度。

    返回值类型:interval、timestamp with time zone、timestamp without time zone

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT date_trunc('hour', timestamp  '2001-02-16 20:38:40');
         date_trunc      
    ---------------------
     2001-02-16 20:00:00
    (1 row)
    
  • trunc(timestamp)

    描述:默认按天截取。

    示例:

    1
    2
    3
    4
    gaussdb=# SELECT trunc(timestamp  '2001-02-16 20:38:40');                                                                                                                                                                   trunc
    ---------------------
    2001-02-16 00:00:00
    (1 row)
    
  • trunc(arg1, arg2)

    描述:截取到arg2指定的精度。

    arg1类型:interval、timestamp with time zone、timestamp without time zone

    arg2类型:text

    返回值类型:interval、timestamp with time zone、timestamp without time zone

    示例:

    1
    2
    3
    4
    gaussdb=# SELECT trunc(timestamp  '2001-02-16 20:38:40', 'hour');                                                                                                                                                                   trunc
    ---------------------
    2001-02-16 20:00:00
    (1 row)
    
  • round(arg1, arg2)

    描述:四舍五入到arg2指定的精度。

    arg1类型:timestamp without time zone

    arg2类型:text

    返回值类型:timestamp without time zone

    示例:

    1
    2
    3
    4
    gaussdb=# SELECT round(timestamp  '2001-02-16 20:38:40', 'hour');                                                                                                                                                                   round
    ---------------------
    2001-02-16 21:00:00
    (1 row)
    
    说明:

    此函数在A兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s1的情况下有效。

  • daterange(arg1, arg2)

    描述:获取时间边界信息。arg1和arg2的类型为date。

    返回值类型:daterange

    示例:

    1
    2
    3
    4
    5
    gaussdb=# select daterange('2000-05-06','2000-08-08');
            daterange        
    -------------------------
     [2000-05-06,2000-08-08)
    (1 row)
    
  • daterange(arg1, arg2, text)

    描述:获取时间边界信息。arg1和arg2的类型为date,text类型为text。

    返回值类型:daterange

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT daterange('2000-05-06','2000-08-08','[]');
            daterange        
    -------------------------
     [2000-05-06,2000-08-09)
    (1 row)
    
  • extract(field from timestamp)

    描述:获取小时的值。

    返回值类型:double precision

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT extract(hour from timestamp '2001-02-16 20:38:40');
     date_part 
    -----------
            20
    (1 row)
    
  • extract(field from interval)

    描述:获取月份的值。如果大于12,则取与12的模。

    返回值类型:double precision

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT extract(month from interval '2 years 3 months');
     date_part 
    -----------
             3
    (1 row)
    
  • isfinite(date)

    描述:判断日期是否为有限值,是则返回t,否则返回f。

    返回值类型:Boolean

    示例:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    gaussdb=# SELECT isfinite(date '2001-02-16');
     isfinite 
    ----------
     t
    (1 row)
    gaussdb=# SELECT isfinite(date 'infinity');
     isfinite 
    ----------
     f
    (1 row)
    
  • isfinite(timestamp)

    描述:判断时间戳是否为有限值,是则返回t,否则返回f。

    返回值类型:Boolean

    示例:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    gaussdb=# SELECT isfinite(timestamp '2001-02-16 21:28:30');
     isfinite 
    ----------
     t
    (1 row)
    gaussdb=# SELECT isfinite(timestamp 'infinity');
     isfinite 
    ----------
     f
    (1 row)
    
  • isfinite(interval)

    描述:判断时间间隔是否为有限值,是则返回t,暂不支持返回f,输入'infinity'会报错。

    返回值类型:Boolean

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT isfinite(interval '4 hours');
     isfinite 
    ----------
     t
    (1 row)
    
  • justify_days(interval)

    描述:将时间间隔以月(30天为一月)为单位。

    返回值类型:interval

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT justify_days(interval '35 days');
     justify_days 
    --------------
     1 mon 5 days
    (1 row)
    
  • justify_hours(interval)

    描述:将时间间隔以天(24小时为一天)为单位。

    返回值类型:interval

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT JUSTIFY_HOURS(INTERVAL '27 HOURS');
     justify_hours  
    ----------------
     1 day 03:00:00
    (1 row)
    
  • justify_interval(interval)

    描述:结合justify_days和justify_hours,调整interval。

    返回值类型:interval

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT JUSTIFY_INTERVAL(INTERVAL '1 MON -1 HOUR');
     justify_interval 
    ------------------
     29 days 23:00:00
    (1 row)
    
  • localtime

    描述:当前事务的开始时刻的系统时间。

    返回值类型:time

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT localtime AS RESULT;
         result
    ----------------
     16:05:55.664681
    (1 row)
    
  • localtimestamp

    描述:返回当前本条SQL执行开始时刻的系统日期和时间。

    返回值类型:timestamp

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT localtimestamp;
             timestamp          
    ----------------------------
     2017-09-01 17:03:30.781902
    (1 row)
    
  • now()

    描述:当前事务的开始时刻的系统的日期及时间,同一个事务内返回结果相同。

    返回值类型:timestamp with time zone

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT now();
                  now              
    -------------------------------
     2017-09-01 17:03:42.549426+08
    (1 row)
    
  • timenow()

    描述:返回当前本条SQL执行开始时刻的系统日期和时间。

    返回值类型:abstime

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT timenow();
            timenow
    ------------------------
     2020-06-23 20:36:56+08
    (1 row)
    
  • dbtimezone

    描述:当前数据库的时区。

    返回值类型:text

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT dbtimezone;
            dbtimezone
    ------------------------
     PRC
    (1 row)
    
    说明:

    此函数在A兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s2的情况下有效。

  • numtodsinterval(num, interval_unit)

    描述:将数字转换为interval类型。num为numeric类型数字,interval_unit为固定格式字符串('DAY' | 'HOUR' | 'MINUTE' | 'SECOND')。

    可以通过设置GUC参数IntervalStyle为a,兼容该函数interval输出格式。

    返回值类型:interval

    示例:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    gaussdb=# SELECT numtodsinterval(100, 'HOUR');
     numtodsinterval 
    -----------------
     100:00:00
    (1 row)
    
    gaussdb=# SET intervalstyle = a;
    SET
    gaussdb=# SELECT numtodsinterval(100, 'HOUR');
            numtodsinterval
    -------------------------------
     +000000004 04:00:00.000000000
    (1 row)
    
    说明:

    此函数在A兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s2的情况下:当参数interval_unit为 'DAY' 时,参数num超过1000000000会报错。

  • numtoyminterval(num, interval_unit)

    描述:将数字转换为interval类型。num为numeric类型数字,interval_unit为固定格式字符串('YEAR' | 'MONTH')。

    可以通过设置GUC参数IntervalStyle为a,兼容该函数interval输出格式。

    返回值类型:interval

    示例:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    gaussdb=# SELECT numtoyminterval(100, 'MONTH');
     numtoyminterval 
    -----------------
     8 years 4 mons
    (1 row)
    
    gaussdb=# SET intervalstyle = 'a';
    SET
    gaussdb=# SELECT numtoyminterval(100, 'MONTH');
     numtoyminterval 
    -----------------
     8-4
    (1 row)
    
    说明:

    此函数在A兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s2的情况下有效。

  • new_time(date, timezone1,timezone2)

    描述:当timezone1所表示时区的日期时间为date的时候,返回此时timezone2所表示时区的日期时间值。

    返回值类型:timestamp

    示例:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    gaussdb=# SELECT new_time('1997-10-10','AST','EST');
          new_time       
    ---------------------
     1997-10-09 23:00:00
    (1 row)
    gaussdb=# SELECT NEW_TIME(TO_TIMESTAMP ('10-Sep-02 14:10:10.123000','DD-Mon-RR HH24:MI:SS.FF'), 'AST', 'PST');
            new_time         
    -------------------------
     2002-09-10 10:10:10.123
    (1 row)
    
    说明:

    此函数在A兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s2的情况下生效。

  • sessiontimezone

    描述:当前会话的时区,无入参。

    返回值类型:text。

    示例:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    gaussdb=# SELECT SESSIONTIMEZONE;
     session_time_zone 
    -------------------
     PST8PDT
    (1 row)
    gaussdb=# SELECT LOWER(SESSIONTIMEZONE);
       lower   
    -----------
     @ 8 hours
    (1 row)
    
    说明:

    此函数在A兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s2的情况下生效。

    当set session time zone的值为GMT+08:00/GMT-08:00格式时,正值的偏移量被用于格林威治以西的位置,例如GMT+08:00表示西八区,GMT-08:00表示东八区。

  • sys_extract_utc(timestamp| timestamptz)

    描述:从具有时区偏移量或时区区域名称的日期时间值中提取UTC(协调世界时-以前称为格林威治平均时间)。如果未指定时区,则日期时间与会话时区关联。入参有timestmp和timestamp两种形式。

    返回值类型:timestamp。

    示例:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    gaussdb=# SELECT SYS_EXTRACT_UTC(TIMESTAMP '2000-03-28 11:30:00.00'); 
       sys_extract_utc   
    ---------------------
     2000-03-28 03:30:00
    (1 row)
    gaussdb=# SELECT SYS_EXTRACT_UTC(TIMESTAMPTZ '2000-03-28 11:30:00.00 -08:00'); 
       sys_extract_utc   
    ---------------------
     2000-03-28 19:30:00
    (1 row)
    
    说明:

    此函数在A兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s2的情况下有效。

  • tz_offset('time_zone_name' | '(+/-)hh:mi' | SESSIONTIMEZONE | DBTIMEZONE)

    描述:入参有以上四种形式,返回入参所表示时区的UTC偏移量。

    返回值类型:text。

    示例:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    gaussdb=# SELECT TZ_OFFSET('US/Pacific');
     tz_offset 
    -----------
     -08:00
    (1 row)
    gaussdb=# SELECT TZ_OFFSET(sessiontimezone);
     tz_offset 
    -----------
     +08:00
    (1 row)
    
    说明:

    此函数在A兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s2的情况下生效。

  • pg_sleep(seconds)

    描述:服务器线程延迟时间,单位为秒。

    返回值类型:void

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT pg_sleep(10);
     pg_sleep 
    ----------
    
    (1 row)
    
  • statement_timestamp()

    描述:当前日期和时间(当前语句的开始)。

    返回值类型:timestamp with time zone

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT statement_timestamp();
          statement_timestamp      
    -------------------------------
     2017-09-01 17:04:39.119267+08
    (1 row)
    
  • sysdate

    描述:返回当前本条SQL执行时刻的系统日期和时间。

    返回值类型:timestamp

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT sysdate;
           sysdate       
    ---------------------
     2017-09-01 17:04:49
    (1 row)
    
  • current_sysdate

    描述:返回当前本条SQL执行开始时刻的系统日期和时间。

    返回值类型:timestamp

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT current_sysdate();
       current_sysdate   
    ---------------------
     2023-06-20 20:09:02
    (1 row)
    
  • timeofday()

    描述:返回当前函数被调用时的系统时间的时间时间戳(像clock_timestamp,但是返回时为text)。

    返回值类型:text

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT timeofday();
                  timeofday              
    -------------------------------------
     Fri Sep 01 17:05:01.167506 2017 CST
    (1 row)
    
  • transaction_timestamp()

    描述:当前事务开始的系统的日期及时间。

    返回值类型:timestamp with time zone

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT transaction_timestamp();
         transaction_timestamp     
    -------------------------------
     2017-09-01 17:05:13.534454+08
    (1 row)
    
  • add_months(d,n)

    描述:用于计算时间点d再加上n个月的时间。

    d:timestamp类型的值,以及可以隐式转换为timestamp类型的值。

    n:INTEGER类型的值,以及可以隐式转换为INTEGER类型的值。

    返回值类型:timestamp

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT add_months(to_date('2017-5-29', 'yyyy-mm-dd'), 11) FROM sys_dummy;
         add_months      
    ---------------------
     2018-04-29 00:00:00
    (1 row)
    
    说明:
    此函数在A兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s1的情况下:
    • 当计算结果大于公元9999年时会报错。
    • 参数n入参若为小数则不会被四舍五入,而是被截断。
  • last_day(d)

    描述:用于计算时间点d当月最后一天的时间。

    返回值类型:timestamp

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT last_day(to_date('2017-01-01', 'YYYY-MM-DD')) AS cal_result;
         cal_result      
    ---------------------
     2017-01-31 00:00:00
    (1 row)
    
  • months_between(d1, d2)

    描述:用于计算时间点d1和时间点d2的月份差值,如果两个日期都是月末或天数相同,则返回整数,否则返回值带小数,按31天/月计算。

    返回值类型:numeric

    示例:

    gaussdb=# SELECT months_between(to_date('2022-10-31', 'yyyy-mm-dd'), to_date('2022-09-30', 'yyyy-mm-dd'));
     months_between 
    ----------------
                 1
    (1 row)
    
    gaussdb=# SELECT months_between(to_date('2022-10-30', 'yyyy-mm-dd'), to_date('2022-09-30', 'yyyy-mm-dd'));
     months_between 
    ----------------
                 1
    (1 row)
    
    gaussdb=# SELECT months_between(to_date('2022-10-29', 'yyyy-mm-dd'), to_date('2022-09-30', 'yyyy-mm-dd'));
        months_between     
    -----------------------
     .96774193548387096774
    (1 row)
    说明:

    此函数在A兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s1的情况下有效。

  • next_day(x,y)

    描述:用于计算时间点x开始的下一个星期几(y)的时间。

    返回值类型:timestamp

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT next_day(timestamp '2017-05-25 00:00:00','Sunday')AS cal_result;
         cal_result      
    ---------------------
     2017-05-28 00:00:00
    (1 row)
    
说明:
  • next_day第二个参数支持缩写(不区分大小写),包括SUN、MON、TUE、WED、THU、THUR、FRI、SAT。
  • tinterval(abstime, abstime)

    描述:用两个绝对时间创建时间间隔。

    返回值类型:tinterval

    示例:

    1
    2
    3
    4
    5
    gaussdb=# call tinterval(abstime 'May 10, 1947 23:59:12', abstime 'Mon May  1 00:30:30 1995');
                          tinterval
    -----------------------------------------------------
     ["1947-05-10 23:59:12+09" "1995-05-01 00:30:30+08"]
    (1 row)
    
  • tintervalend(tinterval)

    描述:返回tinterval的结束时间。

    返回值类型:abstime

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT tintervalend('["Sep 4, 1983 23:59:12" "Oct4, 1983 23:59:12"]');
          tintervalend
    ------------------------
     1983-10-04 23:59:12+08
    (1 row)
    
  • tintervalrel(tinterval)

    描述:计算并返回tinterval的相对时间。

    返回值类型:reltime

    示例:

    1
    2
    3
    4
    5
    gaussdb=# SELECT tintervalrel('["Sep 4, 1983 23:59:12" "Oct4, 1983 23:59:12"]');
     tintervalrel
    --------------
     1 mon
    (1 row)
    
  • smalldatetime_ge

    描述:判断是否第一个参数大于等于第二个参数。

    参数:smalldatetime, smalldatetime

    返回值类型:boolean

  • smalldatetime_cmp

    描述:对比smalldatetime是否相等。

    参数:smalldatetime, smalldatetime

    返回值类型:integer

  • smalldatetime_eq

    描述:对比smalldatetime是否相等。

    参数:smalldatetime, smalldatetime

    返回值类型:boolean。

  • smalldatetime_gt

    描述:判断是否第一个参数大于第二个参数。

    参数:smalldatetime, smalldatetime

    返回值类型:boolean

  • smalldatetime_hash

    描述:计算timestamp对应的哈希值。

    参数:smalldatetime

    返回值类型:integer

  • smalldatetime_in

    描述:输入timestamp。

    参数:cstring, oid, integer

    返回值类型:smalldatetime

  • smalldatetime_larger

    描述:返回较大的timestamp。

    参数:smalldatetime, smalldatetime

    返回值类型:smalldatetime

  • smalldatetime_le

    描述:判断是否第一个参数小于等于第二个参数。

    参数:smalldatetime, smalldatetime

    返回值类型:boolean

  • smalldatetime_lt

    描述:判断是否第一个参数小于第二个参数。

    参数:smalldatetime, smalldatetime

    返回值类型:boolean

  • smalldatetime_ne

    描述:比较两个timestamp是否不相等。

    参数:smalldatetime, smalldatetime

    返回值类型:boolean

  • smalldatetime_out

    描述:timestamp转换为外部形式。

    参数:smalldatetime

    返回值类型:cstring

  • smalldatetime_send

    描述:timestamp转换为二进制格式。

    参数:smalldatetime

    返回值类型:bytea

  • smalldatetime_smaller

    描述:返回较小的一个smalldatetime。

    参数:smalldatetime, smalldatetime

    返回值类型:smalldatetime

  • smalldatetime_to_abstime

    描述:smalldatetime转换为abstime。

    参数:smalldatetime

    返回值类型:abstime

  • smalldatetime_to_time

    描述:smalldatetime转换为time。

    参数:smalldatetime

    返回值类型:time without time zone

  • smalldatetime_to_timestamp

    描述:smalldatetime转换为timestamp。

    参数:smalldatetime

    返回值类型:timestamp without time zone

  • smalldatetime_to_timestamptz

    描述:smalldatetime转换为timestamptz。

    参数:smalldatetime

    返回值类型:timestamp with time zone

  • smalldatetime_to_varchar2

    描述:smalldatetime转换为varchar2。

    参数:smalldatetime

    返回值类型:character varying

    说明:

    获取当前时间有多种方式,请根据实际业务从场景选择合适的接口:

    1. 以下接口按照当前事务的开始时刻返回值:
      CURRENT_DATE
      CURRENT_TIME
      CURRENT_TIME(precision)
      CURRENT_TIMESTAMP(precision)
      LOCALTIME
      LOCALTIMESTAMP
      LOCALTIME(precision)
      LOCALTIMESTAMP(precision)
      transaction_timestamp()
      now()

      其中CURRENT_TIME和CURRENT_TIMESTAMP(precision)传递带有时区的值;LOCALTIME和LOCALTIMESTAMP传递的值不带时区。CURRENT_TIME、LOCALTIME和LOCALTIMESTAMP可以指定精度参数,这会导致结果在秒字段中四舍五入到小数位数。如果没有精度参数,结果将被给予所能得到的全部精度。

      因为这些函数全部都按照当前事务的开始时刻返回结果,所以函数的值在事务运行的整个期间内都不改变。

      其中transaction_timestamp()等价于CURRENT_TIMESTAMP(precision),表示当前语句所在事务的开启时间。now()等效于transaction_timestamp()。

    2. 以下接口返回当前语句开始时间:
      statement_timestamp()

      statement_timestamp()返回当前语句的开始时刻(更准确的说是收到客户端最后一条命令的时间)。statement_timestamp()和transaction_timestamp()在一个事务的第一条命令期间返回值相同,但是在随后的命令中却不一定相同。

    3. 以下接口返回函数被调用时的真实当前时间:
      clock_timestamp()
      timeofday() 

      clock_timestamp()返回真正的当前时间,因此它的值甚至在同一条SQL命令中都会变化。timeofday()和clock_timestamp()相似,timeofday()也返回真实的当前时间,但是它的结果是一个格式化的text串,而不是timestamp with time zone值。

表2显示了可以用于截断日期和时间值的模板。

表2 用于日期/时间截断的模式

类别

模式

描述

微秒

MICROSECON

截断日期/时间,精确到微秒(000000 - 999999)

US

USEC

USECOND

毫秒

MILLISECON

截断日期/时间,精确到毫秒(000 - 999)

MS

MSEC

MSECOND

S

截断日期/时间,精确到秒(00 - 59)

SEC

SECOND

分钟

M

截断日期/时间,精确到分钟(00 - 59)

MI

MIN

MINUTE

小时

H

截断日期/时间,精确到小时(00 - 23)

HH

HOUR

HR

D

截断日期/时间,精确到天(01-01 - 12-31)

DAY

DD

DDD

J

W

截断日期/时间,精确到周(本周的第一天)

WEEK

MM

截断日期/时间,精确到月(本月的第一天)

MON

MONTH

季度

Q

截断日期/时间,精确到季度(本季度的第一天)

QTR

QUARTER

Y

截断日期/时间,精确到年(本年的第一天)

YEAR

YR

YYYY

十年

DEC

截断日期/时间,精确到十年(本十年的第一天)

DECADE

世纪

C

截断日期/时间,精确到世纪(本世纪的第一天)

CC

CENT

CENTURY

千年

MIL

截断日期/时间,精确到千年(本千年的第一天)

MILLENNIA

MILLENNIUM

表3 用于时间截断和时间四舍五入的参数

类别

模式

描述

分钟

M

截断或四舍五入日期/时间,精确到分钟(00 - 59)

MI

MIN

MINUTE

小时

H

截断或四舍五入日期/时间,精确到小时(00 - 23)

HH

HOUR

HR

HH12

HH24

DD

截断或四舍五入日期/时间,精确到天(01-01 - 12-31)

DDD

J

ISO周

IW

截断或四舍五入日期/时间,精确到周(本周的第一天,第一天为周一)

DAY

截断或四舍五入日期/时间,精确到周(本周的第一天,第一天为周日)

DY

D

月周

W

截断或四舍五入日期/时间,精确到周(本周的第一天,第一天为本月第一天的周数)

年周

WW

截断或四舍五入日期/时间,精确到周(本周的第一天,第一天为本年第一天的周数)

MM

截断或四舍五入日期/时间,精确到月(本月的第一天)

MON

MONTH

RM

季度

Q

截断或四舍五入日期/时间,精确到季度(本季度的第一天)

QTR

QUARTER

Y

截断或四舍五入日期/时间,精确到年(本年的第一天)

YEAR

YR

YYYY

SYYYY

YYY

YY

SYEAR

十年

DEC

截断或四舍五入日期/时间,精确到十年(本十年的第一天)

DECADE

世纪

C

截断或四舍五入日期/时间,精确到世纪(本世纪的第一天)

CC

CENT

CENTURY

SCC

千年

MIL

截断或四舍五入日期/时间,精确到千年(本千年的第一天)

MILLENNIA

MILLENNIUM

说明:

表3中行为仅在A兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s1的情况下有效。

  • timestamp_diff(text, timestamp, timestamp)

    描述:计算两个日期时间之间的差值,截取到参数text指定的精度。

    返回值类型:int64

    示例:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    gaussdb=# SELECT timestamp_diff('year','2018-01-01','2020-04-01');
     timestamp_diff 
    ----------------
                  2
    (1 row)
    gaussdb=# SELECT timestamp_diff('month','2018-01-01','2020-04-01');
     timestamp_diff 
    ----------------
                 27
    (1 row)
    gaussdb=# SELECT timestamp_diff('quarter','2018-01-01','2020-04-01');
     timestamp_diff 
    ----------------
                  9
    (1 row)
    gaussdb=# SELECT timestamp_diff('week','2018-01-01','2020-04-01');
     timestamp_diff 
    ----------------
                117
    (1 row)
    gaussdb=# SELECT timestamp_diff('day','2018-01-01','2020-04-01');
     timestamp_diff 
    ----------------
                821
    (1 row)
    gaussdb=# SELECT timestamp_diff('hour','2018-01-01 10:10:10','2018-01-01 12:12:12');
     timestamp_diff 
    ----------------
                  2
    (1 row)
    gaussdb=# SELECT timestamp_diff('minute','2018-01-01 10:10:10','2018-01-01 12:12:12');
     timestamp_diff 
    ----------------
                122
    (1 row)
    gaussdb=# SELECT timestamp_diff('second','2018-01-01 10:10:10','2018-01-01 10:12:12');
     timestamp_diff 
    ----------------
                122
    (1 row)
    gaussdb=# SELECT timestamp_diff('microsecond','2018-01-01 10:10:10','2018-01-01 10:12:12');
     timestamp_diff 
    ----------------
          122000000
    (1 row)
    

TIMESTAMPDIFF

  • TIMESTAMPDIFF(unit , timestamp_expr1, timestamp_expr2)

timestampdiff函数是计算两个日期时间之间(timestamp_expr2-timestamp_expr1)的差值,并以unit形式返回结果。timestamp_expr1,timestamp_expr2必须是一个timestamp、timestamptz、date类型的值表达式。unit表示的是两个日期差的单位。

等效于timestamp_diff(text, timestamp, timestamp)。

说明:

该函数仅在GaussDB兼容MY类型时(即dbcompatibility = 'B')有效,其他类型不支持该函数。

  • year

    年份。

    1
    2
    3
    4
    5
    gaussdb=#  SELECT TIMESTAMPDIFF(YEAR, '2018-01-01', '2020-01-01');
     timestamp_diff
    ----------------
                  2
    (1 row)
    
  • quarter

    季度。

    1
    2
    3
    4
    5
    gaussdb=#  SELECT TIMESTAMPDIFF(QUARTER, '2018-01-01', '2020-01-01');
     timestamp_diff
    ----------------
                  8
    (1 row)
    
  • month

    月份。

    1
    2
    3
    4
    5
    gaussdb=#  SELECT TIMESTAMPDIFF(MONTH, '2018-01-01', '2020-01-01');
     timestamp_diff
    ----------------
                 24
    (1 row)
    
  • week

    星期。

    1
    2
    3
    4
    5
    gaussdb=#  SELECT TIMESTAMPDIFF(WEEK, '2018-01-01', '2020-01-01');
     timestamp_diff
    ----------------
                104
    (1 row)
    
  • day
    天。
    1
    2
    3
    4
    5
    gaussdb=#  SELECT TIMESTAMPDIFF(DAY, '2018-01-01', '2020-01-01');
     timestamp_diff
    ----------------
                730
    (1 row)
    
  • hour

    小时。

    1
    2
    3
    4
    5
    gaussdb=#  SELECT TIMESTAMPDIFF(HOUR, '2020-01-01 10:10:10', '2020-01-01 11:11:11');
     timestamp_diff
    ----------------
                  1
    (1 row)
    
  • minute

    分钟。

    1
    2
    3
    4
    5
    gaussdb=#  SELECT TIMESTAMPDIFF(MINUTE, '2020-01-01 10:10:10', '2020-01-01 11:11:11');
     timestamp_diff
    ----------------
                 61
    (1 row)
    
  • second

    秒。

    1
    2
    3
    4
    5
    gaussdb=#  SELECT TIMESTAMPDIFF(SECOND, '2020-01-01 10:10:10', '2020-01-01 11:11:11');
     timestamp_diff
    ----------------
               3661
    (1 row)
    
  • microseconds

    秒域(包括小数部分)乘以1,000,000。

    1
    2
    3
    4
    5
    gaussdb=#  SELECT TIMESTAMPDIFF(MICROSECOND, '2020-01-01 10:10:10.000000', '2020-01-01 10:10:10.111111');
     timestamp_diff
    ----------------
             111111
    (1 row)
    
  • timestamp_expr含有时区
    1
    2
    3
    4
    5
    gaussdb=# SELECT TIMESTAMPDIFF(HOUR,'2020-05-01 10:10:10-01','2020-05-01 10:10:10-03');
     timestamp_diff
    ----------------
                  2
    (1 row)
    

EXTRACT

  • EXTRACT(field FROM source)

extract函数从日期或时间的数值里抽取子域,比如年、小时等。source必须是一个timestamp、time或interval类型的值表达式(类型为date的表达式转换为timestamp,因此也可以用)。field是一个标识符或者字符串,它指定从源数据中抽取的域。extract函数返回类型为double precision的数值。field的取值范围如下所示。

  • century

    世纪。

    第一个世纪从0001-01-01 00:00:00 AD开始。这个定义适用于所有使用阳历的国家。没有0世纪,直接从公元前1世纪到公元1世纪。

    1
    2
    3
    4
    5
    gaussdb=# SELECT EXTRACT(CENTURY FROM TIMESTAMP '2000-12-16 12:21:13');
     date_part 
    -----------
            20
    (1 row)
    
  • day
    • 如果source为timestamp,表示月份里的日期(1-31)。
      1
      2
      3
      4
      5
      gaussdb=# SELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20:38:40');
       date_part 
      -----------
              16
      (1 row)
      
    • 如果source为interval,表示天数。
      1
      2
      3
      4
      5
      gaussdb=# SELECT EXTRACT(DAY FROM INTERVAL '40 days 1 minute');
       date_part 
      -----------
              40
      (1 row)
      
  • decade

    年份除以10。

    1
    2
    3
    4
    5
    gaussdb=# SELECT EXTRACT(DECADE FROM TIMESTAMP '2001-02-16 20:38:40');
     date_part 
    -----------
           200
    (1 row)
    
  • dow

    每周的星期几,星期天(0)到星期六(6)。

    1
    2
    3
    4
    5
    gaussdb=# SELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40');
     date_part 
    -----------
             5
    (1 row)
    
  • doy

    一年的第几天(1~365/366)。

    1
    2
    3
    4
    5
    gaussdb=# SELECT EXTRACT(DOY FROM TIMESTAMP '2001-02-16 20:38:40');
     date_part 
    -----------
            47
    (1 row)
    
  • epoch
    • 如果source为timestamp with time zone,表示自1970-01-01 00:00:00-00 UTC以来的秒数(结果可能是负数);

      如果source为date和timestamp,表示自1970-01-01 00:00:00-00当地时间以来的秒数;

      如果source为interval,表示时间间隔的总秒数。

      1
      2
      3
      4
      5
      gaussdb=# SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40.12-08');
        date_part   
      --------------
       982384720.12
      (1 row)
      
      1
      2
      3
      4
      5
      gaussdb=# SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours');
       date_part 
      -----------
          442800
      (1 row)
      
    • 将epoch值转换为时间戳的方法。
      1
      2
      3
      4
      5
      gaussdb=# SELECT TIMESTAMP WITH TIME ZONE 'epoch' + 982384720.12 * INTERVAL '1 second' AS RESULT;
                result          
      ---------------------------
       2001-02-17 12:38:40.12+08
      (1 row)
      
  • hour

    小时域(0-23)。

    1
    2
    3
    4
    5
    gaussdb=# SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40');
     date_part 
    -----------
            20
    (1 row)
    
  • isodow

    一周的第几天(1-7)。

    星期一为1,星期天为7。

    说明:

    除了星期天外,都与dow相同。

    1
    2
    3
    4
    5
    gaussdb=# SELECT EXTRACT(ISODOW FROM TIMESTAMP '2001-02-18 20:38:40');
     date_part 
    -----------
             7
    (1 row)
    
  • isoyear

    日期中的ISO 8601标准年(不适用于间隔)。

    每个带有星期一开始的周中包含1月4日的ISO年,所以在年初的1月或12月下旬的ISO年可能会不同于阳历的年。详细信息请参见后续的week描述。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    gaussdb=# SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-01');
     date_part 
    -----------
          2005
    (1 row)
    gaussdb=# SELECT EXTRACT(WEEK FROM TIMESTAMP '2006-01-01 00:00:40');
     date_part
    -----------
            52
    (1 row)
    
    gaussdb=# SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-02');
     date_part 
    -----------
          2006
    (1 row)
    gaussdb=# SELECT EXTRACT(WEEK FROM TIMESTAMP '2006-01-02 00:00:40');
     date_part
    -----------
             1
    (1 row)
  • microseconds

    秒域(包括小数部分)乘以1,000,000。

    1
    2
    3
    4
    5
    gaussdb=# SELECT EXTRACT(MICROSECONDS FROM TIME '17:12:28.5');
     date_part 
    -----------
      28500000
    (1 row)
    
  • millennium

    千年。

    20世纪(19xx年)里面的年份在第二个千年里。第三个千年从2001年1月1日零时开始。

    1
    2
    3
    4
    5
    gaussdb=# SELECT EXTRACT(MILLENNIUM FROM TIMESTAMP '2001-02-16 20:38:40');
     date_part 
    -----------
             3
    (1 row)
    
  • milliseconds

    秒域(包括小数部分)乘以1000。请注意它包括完整的秒。

    1
    2
    3
    4
    5
    gaussdb=# SELECT EXTRACT(MILLISECONDS FROM TIME '17:12:28.5');
     date_part 
    -----------
         28500
    (1 row)
    
  • minute

    分钟域(0-59)。

    1
    2
    3
    4
    5
    gaussdb=# SELECT EXTRACT(MINUTE FROM TIMESTAMP '2001-02-16 20:38:40');
     date_part 
    -----------
            38
    (1 row)
    
  • month

    如果source为timestamp,表示一年里的月份数(1-12)。

    1
    2
    3
    4
    5
    gaussdb=# SELECT EXTRACT(MONTH FROM TIMESTAMP '2001-02-16 20:38:40');
     date_part 
    -----------
             2
    (1 row)
    

    如果source为interval,表示月的数目,然后对12取模(0-11)。

    1
    2
    3
    4
    5
    gaussdb=# SELECT EXTRACT(MONTH FROM INTERVAL '2 years 13 months');
     date_part 
    -----------
             1
    (1 row)
    
  • quarter

    该天所在的该年的季度(1-4)。

    1
    2
    3
    4
    5
    gaussdb=# SELECT EXTRACT(QUARTER FROM TIMESTAMP '2001-02-16 20:38:40');
     date_part 
    -----------
             1
    (1 row)
    
  • second

    秒域,包括小数部分(0-59)。

    1
    2
    3
    4
    5
    gaussdb=# SELECT EXTRACT(SECOND FROM TIME '17:12:28.5');
     date_part 
    -----------
          28.5
    (1 row)
    
  • timezone

    与UTC的时区偏移量,单位为秒。正数对应UTC东边的时区,负数对应UTC西边的时区。

  • timezone_hour

    时区偏移量的小时部分。

  • timezone_minute

    时区偏移量的分钟部分。

  • week

    该天在所在的年份里是第几周。ISO 8601定义一年的第一周包含该年的一月四日(ISO-8601 的周从星期一开始)。换句话说,一年的第一个星期四在第一周。

    在ISO定义里,一月的头几天可能是前一年的第52或者第53周,十二月的后几天可能是下一年第一周。比如,2006-01-01是2005年的第52周,而2006-01-02是2006年的第1周。建议isoyear字段和week一起使用以得到一致的结果。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    gaussdb=# SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-01');
     date_part 
    -----------
          2005
    (1 row)
    gaussdb=# SELECT EXTRACT(WEEK FROM TIMESTAMP '2006-01-01 00:00:40');
     date_part
    -----------
            52
    (1 row)
    
    gaussdb=# SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-02');
     date_part 
    -----------
          2006
    (1 row)
    gaussdb=# SELECT EXTRACT(WEEK FROM TIMESTAMP '2006-01-02 00:00:40');
     date_part
    -----------
             1
    (1 row)
  • year

    年份域。

    1
    2
    3
    4
    5
    gaussdb=# SELECT EXTRACT(YEAR FROM TIMESTAMP '2001-02-16 20:38:40');
     date_part 
    -----------
          2001
    (1 row)
    

date_part

date_part函数是在传统的Ingres函数的基础上制作的(该函数等效于SQL标准函数extract):

  • date_part('field', source)

这里的field参数必须是一个字符串,而不是一个名称。有效的field与extract一样,详细信息请参见EXTRACT

示例:

1
2
3
4
5
gaussdb=# SELECT date_part('day', TIMESTAMP '2001-02-16 20:38:40');
 date_part 
-----------
        16
(1 row)
1
2
3
4
5
gaussdb=# SELECT date_part('hour', INTERVAL '4 hours 3 minutes');
 date_part 
-----------
         4
(1 row)

表4显示了可以用于格式化日期和时间值的模板。

表4 用于日期/时间格式化的模式

类别

模式

描述

小时

HH

一天的小时数(01-12)

HH12

一天的小时数(01-12)

HH24

一天的小时数(00-23)

分钟

MI

分钟(00-59)

SS

秒(00-59)

FF

微秒(000000-999999)

FF1

微秒(0-9)

FF2

微秒(00-99)

FF3

微秒(000-999)

FF4

微秒(0000-9999)

FF5

微秒(00000-99999)

FF6

微秒(000000-999999)

SSSSS

午夜后的秒(0-86399)

上、下午

AM或A.M.

上午标识

PM或P.M.

下午标识

Y,YYY

带逗号的年(4和更多位)

SYYYY

公元前四位年

YYYY

年(4和更多位)

YYY

年的后三位

YY

年的后两位

Y

年的最后一位

IYYY

ISO年(4位或更多位)

IYY

ISO年的最后三位

IY

ISO年的最后两位

I

ISO年的最后一位

RR

年的后两位(可在21世纪存储20世纪的年份)

RRRR

可接收4位年或两位年。若是两位,则和RR的返回值相同,若是四位,则和YYYY相同。

  • BC或B.C.
  • AD或A.D.

纪元标识。BC(公元前),AD(公元后)。

MONTH

全长大写月份名(空白填充为9字符)

MON

大写缩写月份名(3字符)

MM

月份数(01-12)

RM

罗马数字的月份(I-XII ;I=JAN)(大写)

DAY

全长大写日期名(空白填充为9字符)

DY

缩写大写日期名(3字符)

DDD

一年里的日(001-366)

DD

一个月里的日(01-31)

D

一周里的日(1-7 ;周日是 1)

W

一个月里的周数(1-5)(第一周从该月第一天开始)

WW

一年里的周数(1-53)(第一周从该年的第一天开始)

IW

ISO一年里的周数(第一个星期四在第一周里)

世纪

CC

世纪(2位)(21 世纪从 2001-01-01 开始)

儒略日

J

儒略日(自公元前 4712 年 1 月 1 日来的天数)

季度

Q

季度

在A兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s1的情况下新增用于格式化日期和时间值的模式:
表5 新增用于格式化日期和时间值的模式

类别

模式

描述

世纪

SCC

世纪标识,公元前会显示-

SYYYY

返回数字型年,公元前会显示-

RR

返回日期的2位年份

RRRR

返回日期的4位年份

YEAR

返回字符型年

SYEAR

返回字符型年,公元前会显示-

日期格式

DL

返回指定长日期形式

DS

返回指定短日期

TS

返回指定时间格式

FF7

微秒(0000000-9999990)

FF8

微秒(00000000-99999900)

FF9

微秒(000000000-999999000)

说明:

上表中RR计算年的规则如下:

  • 输入的两位年份在00~49之间:

    当前年份的后两位在00~49之间,返回值年份的前两位和当前年份的前两位相同;

    当前年份的后两位在50~99之间,返回值年份的前两位是当前年份的前两位加1。

  • 输入的两位年份在50~99之间:

    当前年份的后两位在00~49之间,返回值年份的前两位是当前年份的前两位减1;

    当前年份的后两位在50~99之间,返回值年份的前两位和当前年份的前两位相同。

说明:
在A兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s1的情况下:
  • to_date, to_timestamp函数支持FX模式(输入和模式严格对应),支持X模式(小数点)。
  • 输入模式不能出现超过一次,表示相同信息的模式不能同时出现。如SYYYY和BC不能同时出现。
  • 模式大小写不敏感。
  • 建议输入和模式之间使用分隔符,否则不保证行为与O完全一致
提示

您即将访问非华为云网站,请注意账号财产安全

文档反馈

文档反馈

意见反馈

0/500

标记内容

同时提交标记内容