Oracle DB在日期

时间:2015-05-06 05:30:43

标签: sql oracle datetime oracle11g date-arithmetic

我想查询night 12.01 AM to 11.59 PM之间的记录数,但问题是,我想安排此查询,因此我无法指定任何硬编码日期。

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

2 个答案:

答案 0 :(得分:1)

  

查询应在12.01 AM到11.59 PM之间提取查询日期的记录数。

你可以这样做:

  • TRUNC 为您提供截断时间部分的日期元素
  • 使用 TO_CHAR
  • SYSDATE 转换为字符串
  • 然后连接时间元素
  • 最终将所有内容转换回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

答案 1 :(得分:0)

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

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

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

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