【发布时间】:2016-08-01 08:10:37
【问题描述】:
我的要求是从日期类型列中获取 GMT/UTC 时间。但是当我使用 cast 将日期转换为时间戳时,它使用美国/太平洋时区作为参考,尽管会话时区设置为 GMT。因此,除非我使用 from_tz,否则我看不到想要的结果。我需要修改 oracle sql 中的任何其他时区设置以始终以 GMT 作为参考吗?
alter session set time_zone='+00:00';
select sessiontimezone from dual;
select current_timestamp from dual;
select sys_extract_utc(cast (sysdate as timestamp)) from dual;
select sys_extract_utc(from_tz(cast (sysdate as timestamp), '-07:00')) from dual;
select sys_extract_utc(current_timestamp) from dual;
Session altered.
SESSIONTIMEZONE
---------------------------------------------------------------------------
+00:00
CURRENT_TIMESTAMP
---------------------------------------------------------------------------
11-APR-16 08.46.42.292173 AM +00:00
SYS_EXTRACT_UTC(CAST(SYSDATEASTIMESTAMP))
---------------------------------------------------------------------------
11-APR-16 01.46.42.000000 AM
SYS_EXTRACT_UTC(FROM_TZ(CAST(SYSDATEASTIMESTAMP),'-07:00'))
---------------------------------------------------------------------------
11-APR-16 08.46.42.000000 AM
SYS_EXTRACT_UTC(CURRENT_TIMESTAMP)
---------------------------------------------------------------------------
11-APR-16 08.46.42.295310 AM
Tasks 表有一个名为 task_started 的日期类型列。我希望从此日期字段中获取 UTC 时间。作为其中的一部分,我试图在插入数据时将会话时区更改为 GMT,以便我可以简单地将其转换回无效的时间戳。
select task_started from tasks where rownum <2;
TASK_STAR
---------
10-APR-16
desc tasks;
Name Null? Type
----------------------------------------- -------- ----------------------------
...
TASK_STARTED DATE
...
【问题讨论】:
-
你能举一个存储日期(带时间)的例子和你期望的输出吗?该列中的日期/时间代表什么时区,您怎么知道 - 是否有另一列存储其时区,或者您是否假设需要进行一些转换?
-
@AlexPoole 我的表只存储了日期,所以我将其转换回时间戳。我假设存储在表中的日期/时间应该使用 GMT 的会话时区,因为我已经更改了会话时区。由于演员功能正在返回美国/太平洋的时间,我很困惑。
-
日期列没有时区(但总是有时间,即使您的查询/客户端没有显示)。如果您将其转换为普通时间戳,则时间将保持不变,但仍然没有时区信息。您的问题是将日期/时间转换为 UTC,这意味着它是从特定区域存储或提供的。例如。如果日期最初是使用 sysdate 插入的,这意味着服务器时区,并且您想要 UTC 等效值。请添加数据和输出,因为不清楚您真正需要什么。
-
但是你到底想做什么,看看时间?
select to_char(task_started, 'YYYY-MM-DD HH24:MI:SS') from tasks ...将显示为字符串。如果您将日期与其他日期进行比较,那么无论如何都会使用时间进行比较。 (只转换成字符串显示)。 -
用更多信息更新了问题。作为始终使用 GMT 作为参考的纪元数生成的一部分,我想先从日期列中获取 GMT 时间,然后从时间生成纪元。正如您所提到的,看起来服务器时区是美国/太平洋,并且在我将日期转换为时间时正在使用它。
标签: sql oracle casting timezone sysdate