TIMESTAMP的时区转换

本文介绍了Oracle数据库中TIMESTAMP类型与时区的操作方法,包括指定包含时区的TIMESTAMP、使用TO_TIMESTAMP_TZ函数、FROM_TZ函数及TIMESTAMP加字符串等方式,并演示了不同时区之间的转换实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TIMESTAMP既然包括了时区的概念,就会碰到将一个时区的时间转换到另一个数区的问题。

 

 

在时区转换之前,首先描述一下如何指定一个包含时区的TIMESTAMP,常用方法有以下几种:

SQL> SELECT SYSTIMESTAMP FROM DUAL;

SYSTIMESTAMP
-------------------------------------------------------------------
09-3
-09 05.37.29.468000 下午 +08:00

SQL> SELECT SYSTIMESTAMP + INTERVAL '5' HOUR FROM DUAL;

SYSTIMESTAMP+INTERVAL'5'HOUR
-------------------------------------------------------------------
09-3
-09 10.38.02.000000000 下午 +08:00

对于服务器当前时区的时间,可以通过SYSTIMESTAMP加减INTERVAL的方式实现。

第二种方法使用TO_TIMESTAMP_TZ

SQL> SELECT TO_TIMESTAMP_TZ('2009-3-9 17:51:23.23 -05:00',
  2  'YYYY-MM-DD HH24:MI:SS.FF TZH:TZM')
  3  FROM DUAL;

TO_TIMESTAMP_TZ('2009-3-917:51:23.23-05:00','YYYY-MM-DDHH24:MI:SS.FFTZH:TZM
---------------------------------------------------------------------------
09-3
-09 05.51.23.230000000 下午 -05:00

Oracle还提供一个FROM_TZ的函数,用来转换一个TIMESTAMP类型到TIMESTAMP WITH TIME ZONE类型:

SQL> SELECT FROM_TZ(CAST(SYSDATE AS TIMESTAMP), '-11:00')
  2  FROM DUAL;

FROM_TZ(CAST(SYSDATEASTIMESTAMP),'-11:00')
--------------------------------------------------------------
09-3
-09 05.44.18.000000 下午 -11:00

当然还可以通过TIMESTAMP加字符串的方式来直接指定一个包含时区的TIMESTAMP类型:

SQL> SELECT TIMESTAMP '2009-3-9 17:56:53.232323 +10:00'
  2  FROM DUAL;

TIMESTAMP'2009-3-917:56:53.232323+10:00'
----------------------------------------------------------
09-3
-09 05.56.53.232323000 下午 +10:00

最后可以使用TIMESTAMP AT TIME ZONE的方式指定时区:

SQL> SELECT TIMESTAMP '2009-3-9 17:56:53.232323'
  2  AT TIME ZONE 'GMT'
  3  FROM DUAL;

TIMESTAMP'2009-3-917:56:53.232323'ATTIMEZONE'GMT'
-----------------------------------------------------
09-3
-09 09.56.53.232323000 上午 GMT

SQL> SELECT TO_CHAR(
  2  TIMESTAMP '2009-3-9 17:56:53.232323'
  3  AT TIME ZONE 'GMT'
  4  , 'YYYY-MM-DD HH24:MI:SS.FF TZH:TZM')
  5  FROM DUAL;

TO_CHAR(TIMESTAMP'2009-3-917:56:53.2
------------------------------------
2009-03-09 09:56:53.232323000 +00:00

Oracle的最后这种方式,不仅支持时区名称方式,而且支持时区的转换。

比如希望将东4区时间转换为西3区的时间:

SQL> SELECT TIMESTAMP '2009-3-9 18:05:23.234 +04:00'
  2  AT TIME ZONE '-03:00'
  3  FROM DUAL;

TIMESTAMP'2009-3-918:05:23.234+04:00'ATTIMEZONE'-03:00'
---------------------------------------------------------------------
09-3
-09 11.05.23.234000000 上午 -03:00

SQL> SELECT FROM_TZ(CAST(SYSDATE AS TIMESTAMP), 'Asia/Shanghai')
  2  AT TIME ZONE 'GMT'
  3  FROM DUAL;

FROM_TZ(CAST(SYSDATEASTIMESTAMP),'ASIA/SHANGHAI')ATTIMEZONE'GMT'
---------------------------------------------------------------------
09-3
-09 09.54.10.000000 上午 GMT

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-566477/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/4227/viewspace-566477/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值