Oracle时区将UTC转换为PST

时间:2016-04-13 08:54:45

标签: oracle timezone timestamp

我需要使用预定开始时间(PST)和预定结束时间(PST)检查正在进行的任务.Datatype是计划开始时间和预定结束时间的时区时间戳。

sysdate(UTC)应位于开始日期和结束日期之间,以确认正在进行的任务

JIRA_KEY  sch_start_time               sch_end_time

1         11/04/2016 1:00:00 AM PST   14/04/2016 2:00:00 PM PST

2         12/04/2016 2:00:00 AM PST   12/04/2016 5:00:00 AM PST

3         12/04/2016 2:00:00 AM PST   14/04/2016 5:00:00 AM PST

预期产出 -

JIRA_KEY  sch_start_time               sch_end_time

1         11/APR/2016 1:00:00 AM PST   14/APR/2016 2:00:00 PM PST

3         12/APR/2016 2:00:00 AM PST   14/APR/2016 5:00:00 AM PST

SYSDATE是UTC格式,截至目前为13 / APR / 2016 8:15 AM

我试过这个。但不确定使用to_timestamp_tz

进行转换
select JIRA_KEY,To_CHAR( SCH_END_TIME,'DD/MON/YY HH:MI:SS PM') as SCH_END_TIME
 FROM HW_JIRA_STATUS WHERE  
to_timestamp_tz(SYSDATE,'DD/MON/YY HH:MI:SS PM') between SCH_START_TIME and SCH_END_TIME

2 个答案:

答案 0 :(得分:1)

当你这样做时

to_timestamp_tz(SYSDATE,'DD/MON/YY HH:MI:SS PM')

您使用NLS_DATE_FORMAT隐式地将SYSDATE转换为字符串,然后将该字符串转换为带时区的时间戳 - 但您没有指定时区,因此它将使用数据库时区默认情况下(这也是你想要的)。

依赖NLS设置很危险,所以至少应该使用expliclt格式掩码:

to_timestamp_tz(to_char(SYSDATE, 'DD/MON/YY HH:MI:SS PM'),'DD/MON/YY HH:MI:SS PM')

...但你也可以cast between data types而不转换为中间字符串;例如再次使用DB服务器时区:

cast(SYSDATE as timestamp with time zone)

你自己不需要做任何转换;你可以改用SYSTIMESTAMP:

WHERE SYSTIMESTAMP between SCH_START_TIME and SCH_END_TIME;

这已经在数据库服务器的时区。

答案 1 :(得分:0)

尝试此查询

select JIRA_KEY,To_CHAR( SCH_END_TIME,'DD/MON/YY HH:MI:SS PM') as SCH_END_TIME
FROM HW_JIRA_STATUS 
WHERE systimestamp AT TIME ZONE 'PST' between SCH_START_TIME and SCH_END_TIME