【问题标题】:Oracle DB select between datesOracle DB 在日期之间选择
【发布时间】:2015-07-16 02:09:14
【问题描述】:

我想查询night 12.01 AM to 11.59 PM 之间的记录数,但问题是,我想安排这个查询,所以我不能指定任何硬编码的日期。

查询应在 12.01 AM 到 11.59 PM 之间提取查询日期的记录数。 有人可以帮我解决这个问题。

【问题讨论】:

  • 您确定不想包含 00:00:00 和 00:00:59 以及 23:59:01 和 23:59:59 之间的任何数据吗?
  • 为什么要从 12:01 开始?如果在 12:00 和 12:01 之间的一分钟间隔内有东西进来,你不想看到它?

标签: sql oracle datetime oracle11g date-arithmetic


【解决方案1】:

我假设您想要在感兴趣的日期发生的所有事情。因此,您需要从当天午夜到第二天午夜之前的所有内容。

declare
    AsOf Date = date '2015-01-01 13:14:15';

select  ...
from    tablename
where   tabledate >= trunc( AsOf )
    and tabledate < trunc( AsOf ) + 1;

如果您知道日期没有时间部分,则可以消除对trunc 的调用。但您可能希望保留它们以防万一。

【讨论】:

    【解决方案2】:

    查询应提取查询日期在上午 12.01 到晚上 11.59 之间的记录数。

    你可以这样做:

    • TRUNC 为您提供截断时间部分的日期元素
    • 使用 TO_CHARSYSDATE 转换为字符串
    • 然后连接时间元素
    • 最终将所有内容转换回 DATE

    SYSDATE 返回为数据库所在操作系统设置的当前日期和时间。返回值的数据类型为DATE,返回格式取决于NLS_DATE_FORMAT初始化参数的值。

    因此,如果您想每天执行查询,则不必对任何 DATE 值进行硬编码。

    filter predicate 中使用以下内容:

    BETWEEN 
            TO_DATE(TO_CHAR(TRUNC(SYSDATE), 'MM/DD/YYYY') ||' 00:01', 'MM/DD/YYYY HH24:MI') 
    AND     
            TO_DATE(TO_CHAR(TRUNC(SYSDATE), 'MM/DD/YYYY') ||' 23:59', 'MM/DD/YYYY HH24:MI')
    

    演示

    SQL> alter session set nls_date_format = 'MM/DD/YYYY HH24:MI:SS';
    
    Session altered.
    
    SQL> SELECT to_date(TO_CHAR(TRUNC(SYSDATE), 'MM/DD/YYYY')
      2    ||' 00:01', 'MM/DD/YYYY HH24:MI') start_dt ,
      3    to_date(TO_CHAR(TRUNC(SYSDATE), 'MM/DD/YYYY')
      4    ||' 23:59', 'MM/DD/YYYY HH24:MI') end_date
      5  FROM dual;
    
    START_DT            END_DATE
    ------------------- -------------------
    05/06/2015 00:01:00 05/06/2015 23:59:00
    
    SQL>
    

    因此,您不必为当前日期输入任何硬编码值,SYSDATE 会处理它。你所做的只是:

    • TRUNC 通过截断时间部分给出日期元素。
    • 然后连接所需的时间元素
    • 使用 TO_DATE 将整个字符串转换为 DATE

    我想安排这个查询,所以我不能指定任何硬线日期

    要安排查询每天执行,您可以使用 DBMS_SCHEDULER

    【讨论】:

    • @downvoter,你愿意解释一下你为什么投反对票吗?
    • 拉利特 - 感谢您的帮助。我认为这个查询对我有用。我将为今天的数据提供此监视器,并在出现任何问题时通知您。
    • @kumarb 不客气。当然。您可以使用示例数据对其进行测试。您的测试用例应该有边界条件来验证过滤谓词是否正常工作。我测试了它,它工作正常。
    • @kumarb 请注意,您不包括秒部分,这意味着您不包括在00:00:00 and 00:00:5923:59:01 and 23:59:59 之间。
    猜你喜欢
    • 2012-10-27
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多