显示创建视图中两个时间戳的正确减法

问题描述:

通过在两个时间戳之间使用正常减号' - '函数,从oracle给出的答案不正确。显示创建视图中两个时间戳的正确减法

这就是我想要做的:

ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT='DD-MON-RR HH24:MI TZR'; 

创建表:

CREATE TABLE TEST (
    StartTime timestamp with time zone 
    ,EndTime timestamp with time zone 
    ,Science varchar2(7) 
); 

我创建列数据类型与时区的时间戳。这是我值已插入:

INSERT INTO TEST 
VALUES('05-OCT-2013 01:00 +08:00' 
     ,'05-OCT-2013 23:00 +06:00' 
     ,'SCIENCE'); 

INSERT INTO TEST 
VALUES('05-OCT-2013 12:00 +08:00' 
     ,'05-OCT-2013 15:00 -12:00' 
     ,'Maths'); 

试图四舍五入时间:

CREATE VIEW TESTRECRDS AS 
SELECT (Extract(hour FROM(ENDTIME- STARTTIME)) || 'Hours' || 
Extract(minute FROM(ENDTIME- STARTTIME))>=60 Then (Extract(hour FROM(ENDTIME- STARTTIME)) + Extract(minute FROM(ENDTIME- STARTTIME))/60 ELSE 0 END || 'Minutes' AS DURATION, 
Science 
FROM Test; 

现在我有一个关于在计算和四舍五入分钟至最近的小时两个问题。 首先,让我们说,结束时间为1535 0600,并开始时间是01:50 +0800 所以当我扣结束时间 - 开始时间: 的公式应该是:

2135 - 0950 = 2085 - 0950 
= 1135 

但是,如果我用我的成功尝试的答案来计算,这不是正确的确切答案。甲骨文的答案将是15小时45分钟。

+0

没有做这个(据我所知)数据类型 - 有什么坏处使用'DATE数据类型,如果你只想从它的时区? –

+0

好的,我想在创建我的表的过程中插入带时区的时间戳。 DATE数据类型也可以这样做吗? – JLearner

+0

@ user976050:否。日期数据类型不包含时区。想想看。 “日期”与时区无关。 –

在你的最后CREATE VIEW声明试图乘text,这不能工作:

SELECT To_Char(STARTTIME - ENDTIME, 'HH24:MI TZR')*24 AS DURATION 

*24是在文本to_char()返回操作。 您必须将之间的间隔乘以才能转换为文本。


您定义列Science varchar2(6),然后插入'SCIENCE',有7个字母的单词?


我还修复了INSERT语句中的语法错误:缺少'


关于您的评论:?
“我想创造我的表的过程中插入带时区的时间戳会日期型数据不要太

阅读data types in the manual
数据类型date。不包括时区信息


如果通过“时区差异”您的意思是时间差一个改性剂,用这个来计算:

这里
SELECT EXTRACT(timezone_hour FROM STARTTIME) AS tz_modifier FROM tbl 

关键词是timezone_hourtimezone_minute。阅读more in the manual

但请注意,这些数字取决于夏令时和其他恶作剧。很不确定的领土!


得到它漂亮的格式 - 例如:

SELECT to_char((EXTRACT (timezone_hour FROM STARTTIME) * 60 
       + EXTRACT (timezone_minutes FROM STARTTIME)) 
       * interval '1 min', 'HH:MI') 

在PostgreSQL,你将有更简单的EXTRACT (timezone FROM STARTTIME),但我不认为Oracle支持。现在不能测试。


下面是一个简单的演示,你怎么能舍几分钟到几小时:

SELECT EXTRACT(hour FROM (ENDTIME - STARTTIME)) 
    + CASE WHEN EXTRACT(minute FROM (ENDTIME - STARTTIME)) >= 30 THEN 1 ELSE 0 END 
FROM Test; 
+0

好吧从我的发言中我创建了这个: SELECT To_Char((STARTTIME - ENDTIME)* 24,'HH24:MI TZR')AS DURATION 但是我真正想要的是计算时区差异并仅填充小时数。 – JLearner

+0

@ user976050:请定义'时区差异'和'填充小时数'。我试图理解,但失败。最好的编辑例子到你的问题,结果应该是什么样子。这会帮助大家理解。 –

+0

您好我已经更新了我插入的表并创建了表。对于我最新的解决方案,我可以计算开始时间和结束时间之间的不同时间戳。但是,它不能帮助我计算时区差异。 Oracle能够计算时区差异吗?并添加到持续时间。 – JLearner

为了圆你将需要做更多的数学。尝试是这样的:

TO_DATE(ROUND((ENDTIME - STARTTIME)* 96)/ 96, 'HH24:MI')

日期之间的区别是在天。乘以96将度量改为四十五小时。回合,然后转换回日期和格式。使用想要格式化的数字格式可能会更好,在这种情况下,您将除以4而不是96.

时区与时差不是特别相关。您将不得不调整从UTC到该时区的差异,以获得包含Timezone的正确结果。

+0

请看看我编辑过的内容。现在我只希望它在减去后显示HH24:MI TZR。 – JLearner

+0

新回答回答您的原始问题。 – BillThor

我不知道你想什么数字来计算,但是当你在Oracle中减去两个日期,你会得到以天为单位的日期之间的差值,而不是一个DATE数据类型

SELECT TO_DATE('2011-01-01 09:00', 'yyyy-mm-dd hh24:mi') - 
     TO_DATE('2011-01-01 08:00', 'yyyy-mm-dd hh24:mi') AS diff 
    FROM dual 

     DIFF 
---------- 
.041666667 

在这种情况下,上午8点和上午9点相距0.41667天。这不是一个日期对象,这是一个标量数字,因此格式化为HH24:MI没有任何意义。

+0

从你给出的解决方案,这是我在第一个地方创建我的表,并且开始时间和结束时间的属性是日期格式。但是现在我希望它可以减去时区差异。如果我按你的方式做,它不会计算时区。 – JLearner

+0

你是说你想在两个时间戳中考虑时间区域的差异? – eaolson

+0

是的。我已经修改了我的解决方案,现在我希望将两个提取合并到一个列中。 – JLearner