如何使用round和trunc来获得dd:mm:yy:hh

时间:2015-05-28 09:19:07

标签: sql oracle oracle11g

我正在使用oracle 11g并且我有正常的时间戳(starttime),它产生如下输出:

 23.09.14 05:15:00,000000000

现在我想要一个像

这样的输出
23.09.14 05

也可以:

23.09.14 05:00:00,000000000

但是当我使用像

这样的东西时

round(starttime, 'HH') or trunc(starttime ,'HH24')我总是得到

23.09.14

完全没有时间。

在此处查看stackoverflow,我找到了

substr(TO_CHAR(starttime),0,LENGTH(TO_CHAR(starttime))-13)

产生正确的输出为char但是当我想对日期进行排序时它不会起作用,因为它按字母顺序排序。 (例如,1.3。,1.4,1.5 ....而不是1.3。,2.3。,3.3,......),

知道我怎么能得到一个四舍五入到整个小时的时间戳?

我将不得不在group by子句中使用该语句。完整的陈述如下:

select round(starttime, 'HH24'), sum(counter) from wmsconsolidationorderdwct group by round(starttime, 'HH24') order by round(starttime, 'HH24') desc;

所以我无法显示舍入时间并按完整时间戳排序,因为这会违反group by子句。

3 个答案:

答案 0 :(得分:2)

这将截断到小时:

trunc(SYSTIMESTAMP) + extract(hour from SYSTIMESTAMP)/24

编辑:

我刚尝试了一下

SELECT TRUNC(SYSTIMESTAMP ,'HH24') FROM DUAL;

返回正确的结果。

Fiddle

答案 1 :(得分:1)

  • 如果要显示您的目的,请使用 TO_CHAR 和所需的格式模型

例如,

SQL> SELECT TO_CHAR(SYSTIMESTAMP, 'DD.MM.YY HH24') FROM dual;

TO_CHAR(SYS
-----------
28.05.15 15

SQL>
  • 如果您的目的是执行日期算术,则需要将数据类型保留为日期。

例如,

SQL> alter session set nls_date_format='DD-MM-YYYY HH24:MI:SS'
  2  /

Session altered.

SQL> SELECT TRUNC(SYSTIMESTAMP ,'HH24') FROM DUAL
  2  /

TRUNC(SYSTIMESTAMP,
-------------------
28-05-2015 15:00:00

SQL>

答案 2 :(得分:0)

如果您有时间戳对象:

select my_number from(
  SELECT TO_NUMBER(TO_CHAR(TO_DATE (TO_CHAR (SYSTIMESTAMP, 'DD.MM.YY HH24:MI'),
        'DD.MM.YY HH24:MI'
       ),'HH24')) AS my_number
 FROM DUAL)
order by 1

这可以简化为:

select my_number from(
  SELECT TO_NUMBER(TO_CHAR(SYSTIMESTAMP, 'HH24')) AS my_number
FROM DUAL)
order by 1