Sql TRUNC的结果应该是什么(“2014年5月2日”,“HH24”)?

Sql TRUNC的结果应该是什么(“2014年5月2日”,“HH24”)?,sql,oracle,plsql,oracle11g,Sql,Oracle,Plsql,Oracle11g,我发现了一个奇怪的片段,这让我很困惑,所以我想我会问专家 假设一个表a有以下数据列: "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' MINUT

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

假设一个表a有以下数据列:

"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'?

表达式:

TRUNC(sdate, 'HH24')
从小于一小时的日期(即分钟和秒)中删除所有内容。具体日期:

TRUNC('02-MAY-14','HH24')
它返回未更改的日期。只有在Oracle日期包含时间组件时才有意义

您的SQL工具SQL Developer、TOAD等可能配置为不显示Oracle日期的时间部分。原来的日期可能是2014年5月2日09:03:25。然后它会返回:

02-MAY-14 09:00:00

您提到了“开始时间”和“结束时间”列,但在SQL查询中没有使用它们。它们是干什么用的?

因为在您的示例中,开始日期没有时间部分,所以TRUNC在这里是多余的。但是,如果它有一个时间部分,例如,如果在开始日期之前添加了开始时间,那么TRUNC将删除分、秒和微秒,只保留日期和小时,因为“HH24”意味着将日期时间截断为整小时。

在Oracle中,日期数据类型本身也存储时间

尝试执行下面的查询。它应该会把事情弄清楚一点:


从DUAL中选择至_CHARSYSDATE,'DD-MON-yyyyy HH:MI:SS',至_CHARTRUNCSYSDATE,'HH24','DD-MON-yyyyy HH:MI:SS'

当你运行这些查询时发生了什么?谢谢Codo简洁的回答。这就是为什么我发现它如此混乱,因为开始日期没有时间部分,所以TRUNCsdate“HH24”应该无效。我不认为该工具截断了时间部分,因为有一列用于收集时间部分。这不是我的SQL,所以我无法回答您的查询,它是由一家大公司提供给我的。