我有一个DATE
列,我想在查询中将其舍入到下一个较低的10分钟时间间隔(请参见下面的示例)。圆整日期到10分钟间隔
我设法通过截短秒数然后减去分钟的最后一位数来完成。
WITH test_data AS (
SELECT TO_DATE('2010-01-01 10:00:00', 'YYYY-MM-DD HH24:MI:SS') d FROM dual
UNION SELECT TO_DATE('2010-01-01 10:05:00', 'YYYY-MM-DD HH24:MI:SS') d FROM dual
UNION SELECT TO_DATE('2010-01-01 10:09:59', 'YYYY-MM-DD HH24:MI:SS') d FROM dual
UNION SELECT TO_DATE('2010-01-01 10:10:00', 'YYYY-MM-DD HH24:MI:SS') d FROM dual
UNION SELECT TO_DATE('2099-01-01 10:00:33', 'YYYY-MM-DD HH24:MI:SS') d FROM dual
)
-- #end of test-data
SELECT
d, TRUNC(d, 'MI') - MOD(TO_CHAR(d, 'MI'), 10)/(24 * 60)
FROM test_data
这里是结果:
01.01.2010 10:00:00 01.01.2010 10:00:00
01.01.2010 10:05 :00 01.01.2010 10:00:00
01.01.2010 10:九点59 01.01.2010 10:00:00
01.01.2010 10:10:00 01.01.2010 10:10:00
2099年1月1日10:00 :33 2099年1月1日10:00:00
正常工作,但有没有更好的办法?
编辑:
我很好奇的表现,所以我做了以下测试以500.000行(不是真的)随机日期。我将把结果作为评论添加到提供的解决方案中。
DECLARE
t TIMESTAMP := SYSTIMESTAMP;
BEGIN
FOR i IN (
WITH test_data AS (
SELECT SYSDATE + ROWNUM/5000 d FROM dual
CONNECT BY ROWNUM <= 500000
)
SELECT TRUNC(d, 'MI') - MOD(TO_CHAR(d, 'MI'), 10)/(24 * 60)
FROM test_data
)
LOOP
NULL;
END LOOP;
dbms_output.put_line(SYSTIMESTAMP - t);
END;
该方法花了03.24 s
。
约'SELECT CASE什么时,TO_CHAR(date_col的, 'MI')在0至10,则TO_DATE(TO_CHAR(date_col的, 'YYYY') ||' - '|| TO_CHAR(date_col,'MM')||' - '|| TO_CHAR(date_col,'DD')||''|| TO_CHAR(date_col,'HH')||':00' ,'YYYY-MM-DD HH:MI') END'? – 2010-02-03 18:29:52
@OMG小马:对不起,但是当'0 <= MI <= 10'时返回整小时,否则返回NULL。 – 2010-02-04 07:04:17
不想混淆其余的时间 – 2010-02-04 15:38:30