我想查询night 12.01 AM to 11.59 PM
之间的记录数,但问题是,我想安排此查询,因此我无法指定任何硬编码日期。
查询应在12.01 AM到11.59 PM之间提取查询日期的记录数。 有人可以帮我这个。
答案 0 :(得分:1)
查询应在12.01 AM到11.59 PM之间提取查询日期的记录数。
你可以这样做:
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
通过截断时间部分来提供日期元素。我想安排此查询,因此我无法指定任何硬编码日期
要安排查询每天执行,您可以使用 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
的调用。但是你可能想要保留它们以防万一。