2

我想说以下,但用 SYSDATE 替换日期,但我想要调整之间的时间。语法是什么?

SYSDATE+'0001'和之间的 mydatefieldSYSDATE+'2359'

...
WHERE TO_CHAR( MOPACTIVITY.MOPNOTIFICATIONSENDAT , 'yyyy-mm-dd hh24:mi' )
  BETWEEN '2013-07-26 00:00:01' AND '2013-07-26 23:59:59'
;
4

3 回答 3

7

Oracle 中的 SYSDATE(或任何其他日期列)具有时间组件。所以你需要把它去掉,然后添加小时/分钟/时间条件。

例如。要说当天上午 10:00 到下午 3:00,您可以说

date_column between (trunc(sysdate) + 10/24) and (trunc(sysdate) + 15/24)

Oracle 日期算术适用于日级别。所以,+1 会在第二天给你,1/24 会给你一个小时,10/24 会给你当天上午 10:00。

SQL> alter session set nls_date_format = 'DD-Mon-YYYY HH:MI:SS AM';

Session altered.

  1  select sysdate,
  2         trunc(sysdate),
  3         trunc(sysdate) + 10/24,
  4         trunc(sysdate) + 15/24
  5* from dual
SQL> /

SYSDATE                  26-Jul-2013 06:26:07 PM
TRUNC(SYSDATE)           26-Jul-2013 12:00:00 AM 
TRUNC(SYSDATE)+10/24     26-Jul-2013 10:00:00 AM 
TRUNC(SYSDATE)+15/24     26-Jul-2013 03:00:00 PM 

对于您的问题,您似乎对当天和第二天之间感兴趣,因此您可以尝试在剥离时间组件后直接将 + 1 添加到日期。

date_column >= trunc(sysdate) and 
date_column < trunc(sysdate)+1
于 2013-07-26T18:27:12.620 回答
1

做到这一点的最好方法是将您的类型保留MOPACTIVITY.MOPNOTIFICATIONSENDATDATE类型。如果列上碰巧有索引,这允许 Oracle 优化查询。我会推荐这样的东西:

WHERE MOPACTIVITY.MOPNOTIFICATIONSENDAT >= TRUNC(SYSDATE)
  AND MOPACTIVITY.MOPNOTIFICATIONSENDAT < TRUNC(SYSDATE) + 1

这归结为“大于或等于今天午夜”和“小于明天午夜”。

于 2013-07-26T18:27:59.297 回答
0

我们也可以截断两个日期,然后比较结果

where TRUNC(MOPACTIVITY.MOPNOTIFICATIONSENDAT) = TRUNC(SYSDATE)

TRUNC 从日期中删除时间戳

于 2013-07-26T18:29:33.620 回答