1

我有一张有 2 列的桌子。定义是

CREATE TABLE LOGGING_T
(
  TSTAMP  DATE,
  LINE    VARCHAR2(300)
)
TABLESPACE OPERATIONS
MONITORING
/

TSTAMP 列具有30-NOV-11, 29-NOV-11... 等值。现在我正在做这个查询

select * from LOGGING_T where TSTAMP >= (SYSDATE - 1)

当前系统日期为01-DEC-11。理想情况下,上述语句应返回具有 TSTAMP = 的记录,30-NOV-11因为我正在做SYSDATE-1的就是30-NOV-11. 但它没有获取这些记录。为什么?

但是,如果我做这个查询

select * from LOGGING_T where TSTAMP >= (SYSDATE - 2)

然后它获取记录 who TSTAMPis 30-NOV-11。我在这个简单的日期操作中做错了吗?

4

2 回答 2

1

SYSDATE 值也具有时间分量。很可能您的数据库中的日期也有时间部分。

将您的查询更改为:

select * from LOGGING_T where TSTAMP >= TRUNC(SYSDATE - 1)

查看从昨天 00:00 开始记录的所有记录。

要查看实际的时间分量,请使用 to char。

SQL> select sysdate from dual;

SYSDATE
---------
01-DEC-11

  1* select to_char(sysdate,'DD-Mon-YYYY HH24:MI:SS') date1 from dual
SQL> /

DATE1
--------------------
01-Dec-2011 16:29:01
于 2011-12-01T21:29:20.107 回答
1

ADATE包含时间和日期。

如果SYSDATE2011-12-01 1:18:00 PM那么SYSDATE-1将是2011-11-30 1:18:00 PM

您期望从 11 月 30 日开始找到的行是在时间元素之前还是之后?

如果您不关心时间,只想根据日期进行过滤,您可以使用TRUNC()

select * 
  from LOGGING_T 
 where TRUNC(TSTAMP) >= TRUNC(SYSDATE - 1);

您可能希望也可能不希望确保比较运算符的两边都已TRUNC()编辑,因为TRUNC()只会将日期的时间元素强制为午夜。

select to_char(trunc(sysdate), 'YYYY-MM-DD HH:MI:SS PM') 
  from dual;

NOW
----------------------
2011-12-01 12:00:00 AM
于 2011-12-01T21:22:40.787 回答