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

Sql 如何使用round和trunc获得dd:mm:yy:hh,sql,oracle,oracle11g,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')或trunc(starttime,'HH24') 23.09.14 一点时间也没有 看看这里我发现的stackoverflow substr(TO_CHAR(sta

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

 23.09.14 05:15:00,000000000
现在我想要一个像这样的输出

23.09.14 05
也可以是:

23.09.14 05:00:00,000000000
但是当我使用类似

round(starttime,'HH')或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……)

你知道我怎样才能得到一个四舍五入到整小时的时间戳吗

我将不得不在GROUPBY子句中使用该语句。完整的声明如下所示:

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

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

如果您有timestamp对象:

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

这将截断为小时:

trunc(SYSTIMESTAMP) + extract(hour from SYSTIMESTAMP)/24
编辑:

我只是试了一下

SELECT TRUNC(SYSTIMESTAMP ,'HH24') FROM DUAL;
返回正确的结果

  • 如果您的目的是显示,则使用对所需的格式模型进行字符
比如说,

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>
  • 如果您的目的是执行日期算术,则需要将数据类型保留为date
比如说,

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>

这将生成与substr(TO_CHAR(starttime)、0、LENGTH(TO_CHAR(starttime))-13相同的输出。这是一个char对象,看起来像我想要的,但我按字母顺序排序,不像日期/时间戳。我已经编辑了我的问题。还需要一个GROUPBY子句,所以我不能按时间戳排序,因为它不是group子句的一部分。我已经编辑了我的答案。将该查询创建为一个内嵌视图,然后在分组后对该查询排序。第一行适合我。非常感谢。第二个在我的情况下不需要。@user1093356我认为您不需要第一个查询。第二个查询是正确的。