首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle上与时区相关的systimestamp和时间戳比较

Oracle上与时区相关的systimestamp和时间戳比较
EN

Stack Overflow用户
提问于 2014-02-07 11:29:00
回答 2查看 1.4K关注 0票数 1

我遇到了一个奇怪的情况。谁能解释一下为什么时间戳和时间戳之间的比较行为如下(它取决于会话时区...)。此外,输出值在所有情况下都是相同的。出于比较的目的,时间戳似乎继承了会话的时区,但对于打印,它不是这样的吗?

查询:

代码语言:javascript
复制
alter session set time_zone = '-6:0';
select cast(systimestamp as timestamp), systimestamp, case when cast(systimestamp as timestamp) < systimestamp then 'timestamp < systm' else 'timestamp >= systm' end as cmp from dual;
alter session set time_zone = '1:0';
select cast(systimestamp as timestamp), systimestamp, case when cast(systimestamp as timestamp) < systimestamp then 'timestamp < systm' else 'timestamp >= systm' end as cmp from dual;

输出:

代码语言:javascript
复制
CAST(SYSTIMESTAMPASTIMESTAMP) SYSTIMESTAMP                        CMP              
----------------------------- ----------------------------------- ------------------
14/02/06 21:22:05,319973000   14/02/06 21:22:05,319973000 -06:00  timestamp >= systm 

session SET altered.
CAST(SYSTIMESTAMPASTIMESTAMP) SYSTIMESTAMP                        CMP              
----------------------------- ----------------------------------- ------------------
14/02/06 21:22:06,057183000   14/02/06 21:22:06,057183000 -06:00  timestamp < systm  

数据库位于-6时区。Oracle Database 11g企业版11.2.0.3.0 -64位生产版

EN

回答 2

Stack Overflow用户

发布于 2017-02-16 20:33:54

看看这个:https://docs.oracle.com/cd/B12037_01/server.101/b10749/ch4datet.htm#1006334

当您比较日期和时间戳值时,

会在进行比较之前将数据转换为更精确的数据类型。例如,如果将TIMESTAMP WITH TIME ZONE数据类型的数据与TIMESTAMP数据类型的数据进行比较,Oracle会使用会话时区将TIMESTAMP数据转换为TIMESTAMP with TIME zone。转换日期和时间戳数据的优先顺序如下: 1.日期2.时间戳3.具有本地时区的时间戳4.具有时区的时间戳对于任何一对数据类型,Oracle会将上述列表中数字较小的数据类型转换为数字较大的数据类型。

票数 1
EN

Stack Overflow用户

发布于 2014-02-07 15:58:24

SYSTIMESTAMP返回TIMESTAMP WITH TIME ZONE数据类型。看起来Oracle将TIMESTAMP转换为TIMESTAMP WITH TIME ZONE数据类型以进行比较,实际上Oracle执行此操作:

代码语言:javascript
复制
SELECT
    CASE 
    WHEN CAST(CAST(SYSTIMESTAMP AS TIMESTAMP) AS TIMESTAMP WITH TIME ZONE) < SYSTIMESTAMP 
        THEN 'timestamp < systm' 
        ELSE 'timestamp >= systm' 
    END AS cmp 
FROM dual;

对于它采用会话时区的转换,您可以使用以下查询进行检查:

代码语言:javascript
复制
SELECT 
    EXTRACT(TIMEZONE_HOUR FROM CAST(CAST(SYSTIMESTAMP AS TIMESTAMP) AS TIMESTAMP WITH TIME ZONE)) AS TZ_HOUR
FROM dual;

您可以讨论这是否有意义。为了正确的转换,你最好使用FROM_TZ函数,然后它在你的控制之下。SYSTIMESTAMP返回DB时区的时间戳,所以正确的语句应该是这样的:

代码语言:javascript
复制
SELECT FROM_TZ(LOCALTIMESTAMP, DBTIMEZONE), SYSTIMESTAMP, 
    CASE FROM_TZ(LOCALTIMESTAMP, DBTIMEZONE) < SYSTIMESTAMP THEN
    ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21618732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档