TRUNC('02 -MAY-14','HH24')的结果应该是什么?

时间:2014-05-08 21:23:15

标签: sql oracle plsql oracle11g

我发现了一个让我感到困惑的奇怪片段,所以我想我会问专家。

假设tableA获得了以下带有数据的列:

"START_TIME":1399075198
"END_TIME":1399075200
"START_DATE":"02-MAY-14"
"END_DATE":"03-MAY-14" 

现在查询1:

 SELECT MIN(start_date) INTO sdate FROM tableA;

查询2:

 SELECT TRUNC(sdate, 'HH24') + INTERVAL '30' MINUTE from dual;

因此,如果开始日期=' 02-MAY-14',那将如何截断到' HH24'?

3 个答案:

答案 0 :(得分:2)

表达式:

TRUNC(sdate, 'HH24')

从小于一小时的日期(即分钟和秒)切断所有内容。具体日期:

TRUNC('02-MAY-14','HH24')

它返回日期不变。只有Oracle日期包含时间组件才有意义。

可能,您的SQL工具(SQL Developer,TOAD等)配置为不显示Oracle日期的时间部分。所以原始日期实际上可能是02-MAY-14 09:03:25。然后它会返回:

02-MAY-14 09:00:00

您提到列 START_TIME END_TIME 但未在SQL查询中使用它们。它们用于什么?

答案 1 :(得分:0)

由于start_date在您的示例中没有时间部分,因此TRUNC在这里是多余的。但是如果它有一个timepart,如果例如start_time之前已经添加到start_date,则TRUNC将删除分钟,秒和微秒,仅保留日期和小时,因为'HH24'意味着“将日期时间截断为整个小时”。

答案 2 :(得分:0)

在Oracle中,date数据类型本身也存储时间。

尝试执行以下查询。它应该清楚一点:

SELECT TO_CHAR(SYSDATE,' DD-MON-YYYY HH:MI:SS'),TO_CHAR(TRUNC(SYSDATE,' HH24'),' DD-MON -YYYY HH:MI:SS')来自DUAL;