加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – 周期到10分钟间隔

发布时间:2020-12-12 16:52:16 所属栏目:MsSql教程 来源:网络整理
导读:我有一个DATE列,我想在查询中舍入到下一个低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
我有一个DATE列,我想在查询中舍入到下一个低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:09:59 01.01.2010 10:00:00
01.01.2010 10:10:00 01.01.2010 10:10:00
01.01.2099 10:00:33 01.01.2099 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,10) / (24 * 60)
    FROM test_data
  )
  LOOP
    NULL;
  END LOOP;
  dbms_output.put_line( SYSTIMESTAMP - t );
END;

这种方法花了03.24秒.

解决方法

select
  trunc(sysdate,'mi')
  - numtodsinterval(mod(EXTRACT(minute FROM cast(sysdate as timestamp)),10),'minute')
from dual;

甚至

select
  trunc(sysdate,'mi')
  - mod(EXTRACT(minute FROM cast(sysdate as timestamp)),10) / (24 * 60)
from dual;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读