当前位置: 首页 > 面试题库 >

将日期以10分钟为间隔

佟颖逸
2023-03-14
问题内容

我有一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: 9时59 听听01.01.2010 10 : 00:00
01.01.2010 10: 10:00 听听01.01.2010 10: 10:00
2099年1月1日10: 0点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
  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;


 类似资料:
  • 问题内容: 我需要获取两个日期之间的分钟数。我知道Joda是最适合使用的,但这是针对Android项目的,因此,我更喜欢使用一些外部库,并且我正在构建的应用程序不需要计算得很精确。 但是,我正在使用的代码似乎无法正常工作。我正在尝试获取“ 11/21/2011 7:00:00 AM”和“ 11/21/2011 1:00:00 PM”之间的分钟数(应该为360分钟),但是代码我’m using返回0

  • 问题内容: 我想找出当前时间之后10分钟的日期时间。假设我们有 我想找到这个,十分钟后。我怎样才能做到这一点? 问题答案: 。基本上,您只需要添加10分钟的时间增量即可获得所需的时间。

  • 问题内容: 如何为Python中以下时间戳计算以分钟为单位的时间差? 问题答案:

  • 问题内容: 我正在尝试将表中的数字键转换为日期时间键。我当前的查询是: 日期列显示:2013-06-22 13:36:44.403 我想将其分为两列:日期:2013-06-22 时间(删除微秒):13:36:44 任何人都可以修改我现有的查询以显示所需的输出吗?这将不胜感激。请注意:我正在使用SQL Server Management Studio 2008。 问题答案: 您可能要研究conver

  • 问题内容: 上面的代码将20分钟添加到StartTimeDate。有什么好方法可以删除那些20分钟未添加的内容?试图找到一种解决方案,但没有找到解决方案。有任何想法吗? 问题答案: 您没有任何特定的功能来减去任何日期部分 只需在前面添加负号 或乘以-1

  • 问题内容: 我需要在系统当前日期时间之前10分钟找到记录。 问题答案: 可能是一个起点。当然,它可能不会完全匹配… …如果您想获取符合该条件的最新记录,请尝试