Oracle中timestamp与date时间转换问题
Posted Uniq_zhou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle中timestamp与date时间转换问题相关的知识,希望对你有一定的参考价值。
项目场景:
Oracle中timestamp与date时间转换问题
问题描述
今天在处理数据同步中碰到了一个棘手的问题,之前运行很好的数据存储过程今天突然包日志执行错误,查询日志后发现,是推送方字段时间格式上出现了问题,他们数据库有个字段的格式varchar类型单储存的是时间格式,而且并非普通date类型,是timestamp格式,而我们服务器是date类型,在传输时出现了如下错误:
原因分析:
双方数据库时间格式不一致导致数据同步错误
解决方案:
对日期时间进行格式转换,将timestamp类型转换为date类型
普通相互转换的方式:
date–>timestamp
select to_date(to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss') from dual;
timestamp–>date
select to_timestamp(to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss') from dual;
对于日期特殊的转换:
年/月/日 变成了 月/日/年:
select to_char(sysdate,'mm-dd-yyyy hh24:mi:ss') from dual;
select to_timestamp('01-01-2016 00:00:00.000000', 'mm-dd-yyyy hh24:mi:ss.ff6') from dual;
gengxinshijian为timestamp值varchar类型时:
select cast(systimestamp as date) from dual;
select systimestamp+0 from dual;
select to_date(to_char(to_timestamp(gengxinshijian, 'mm-dd-yyyy hh24:mi:ss.ff6'),'yyyy/mm/dd hh24:mi:ss'), 'yyyy/mm/dd hh24:mi:ss') from dual;
to_timestamp参数传递可以参考下面官网说明:
https://docs.oracle.com/cd/E11882_01/server.112/e41085/sqlqr02001.htm#sthref713
Oracle 将带有时区的 TIMESTAMP 转换为 DATE
【中文标题】Oracle 将带有时区的 TIMESTAMP 转换为 DATE【英文标题】:Oracle Convert TIMESTAMP with Timezone to DATE 【发布时间】:2013-12-04 02:04:49 【问题描述】:我有时区为+04:00 (Europe/Moscow)
的数据库,需要在Oracle 11g 中将YYYY-MM-DD"T"HH24:MI:SSTZH:TZM
格式的字符串转换为DATE
数据类型。
换句话说,我有一个字符串2013-11-08T10:11:31+02:00
,我想将其转换为DATE
数据类型(在本地数据库时区+04:00 (Europe/Moscow)
)。
对于字符串2013-11-08T10:11:31+02:00
,我所需的转换应返回DATE
数据类型,日期为2013-11-08 12:11:31
(即本地时区时间转换为+04:00 (Europe/Moscow)
)。字符串的时区可能不同,上面字符串中的+02:00
只是示例。
我尝试使用 TIMESTAMP
数据类型执行此操作,但时区转换没有成功。
【问题讨论】:
除了需要“本地”时间的情况(即调度/计划,尤其是夏令时的时区),通常最好存储以 UTC 格式存储的绝对时间戳(并在显示/报告中进行转换) .这些时间戳的用途是什么? 我从外部系统收到这种时间戳格式的日期,但不知道为什么外部系统使用它们。 :( 找到了我的答案.. 但如果你想仔细检查时间戳是真还是假,我找到了一个很好的网站。 onlinetimestampconvert.com 【参考方案1】:您可以使用 CAST(x AT TIME ZONE 'YYYY' AS DATE) 管理时区,这对我有帮助:
WITH t1 (tm) AS (SELECT TIMESTAMP '2021-12-14 15:33:00 EET' FROM DUAL)
SELECT 'EET' tz, CAST (tm AT TIME ZONE 'Europe/Kaliningrad' AS DATE) AS datetime FROM t1
union SELECT 'MSK' tz, CAST (tm AT TIME ZONE 'Europe/Moscow' AS DATE) AS datetime FROM t1
union SELECT 'CET' tz, CAST (tm AT TIME ZONE 'Europe/Prague' AS DATE) AS datetime FROM t1
union SELECT 'UTC' tz, CAST (tm AT TIME ZONE 'UTC' AS DATE) AS datetime FROM t1
【讨论】:
欢迎来到 Stack Overflow。当代码附有解释时,它会更有帮助。 Stack Overflow 是关于学习的,而不是提供 sn-ps 来盲目复制和粘贴。请编辑您的问题并解释它如何回答所提出的具体问题。见【如何回答】***.com/questions/how-to-answer)【参考方案2】:将时间戳转换为日期:
cast(registrationmaster.Stamp5DateTime 作为日期) >= '05-05-2018' AND cast(registrationmaster.Stamp5DateTime 作为日期)
【讨论】:
【参考方案3】:如果您希望您的时区时间戳转换为与“sysdate”同步的日期,请使用以下命令:
select CAST(to_timestamp_tz('2013-11-08T10:11:31-02:00',
'yyyy-mm-dd"T"hh24:mi:sstzh:tzm') at time zone to_char(systimestamp,
'tzh:tzm') AS DATE)
from dual
【讨论】:
我无法告诉你我搜索了多长时间!【参考方案4】:SELECT
CAST((FROM_TZ(CAST(timezonefield AS TIMESTAMP),'GMT') AT TIME ZONE 'CET') AS DATE)
FROM table;
将格林威治标准时间的时间戳转换为中欧时间的日期
【讨论】:
【参考方案5】:带有at time zone
子句的to_timestamp_tz()
函数可用于将字符串文字转换为timestamp with time zone
数据类型的值:
SQL> with t1(tm) as(
2 select '2013-11-08T10:11:31+02:00' from dual
3 )
4 select to_timestamp_tz(tm, 'yyyy-mm-dd"T"hh24:mi:ss TZH:TZM')
5 at time zone '+4:00' as this_way
6 , to_timestamp_tz(tm, 'yyyy-mm-dd"T"hh24:mi:ss TZH:TZM')
7 at time zone 'Europe/Moscow' as or_this_way
8 from t1
9 /
结果:
THIS_WAY OR_THIS_WAY
----------------------------------------------------------------------------
2013-11-08 12.11.31 PM +04:00 2013-11-08 12.11.31 PM EUROPE/MOSCOW
然后,我们使用cast()
函数生成date
数据类型的值:
with t1(tm) as(
select '2013-11-08T10:11:31+02:00' from dual
)
select cast(to_timestamp_tz(tm, 'yyyy-mm-dd"T"hh24:mi:ss TZH:TZM')
at time zone '+4:00' as date) as this_way
, cast(to_timestamp_tz(tm, 'yyyy-mm-dd"T"hh24:mi:ss TZH:TZM')
at time zone 'Europe/Moscow' as date) as or_this_way
from t1
This_Way Or_This_Way
------------------------------------------
2013-11-08 12:11:31 2013-11-08 12:11:31
详细了解at time zone 子句和to_timestamp_tz() 函数。
【讨论】:
谢谢!select CAST(to_timestamp_tz('2013-11-08T10:11:31+02:00', 'yyyy-mm-dd"T"hh24:mi:ss TZH:TZM') at time zone DBTIMEZONE AS DATE) from dual
对我来说是正确的方式以上是关于Oracle中timestamp与date时间转换问题的主要内容,如果未能解决你的问题,请参考以下文章
oracle中date类型怎么转换成timestamp类型?
Oracle 将带有时区的 TIMESTAMP 转换为 DATE