【问题标题】:Fetching column values based on SYSDATE根据 SYSDATE 获取列值
【发布时间】:2012-01-11 00:21:08
【问题描述】:

我有一张有 2 列的表。定义是

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

TSTAMP 列具有 30-NOV-1129-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)

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

【问题讨论】:

    标签: oracle date oracle10g dml


    【解决方案1】:

    DATE 包含时间和日期。

    如果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()ed,因为TRUNC() 只会将日期的时间元素强制为午夜。

    select to_char(trunc(sysdate), 'YYYY-MM-DD HH:MI:SS PM') 
      from dual;
    
    NOW
    ----------------------
    2011-12-01 12:00:00 AM
    

    【讨论】:

    • 您可以省略TRUNC(TSTAMP) 中的TRUNC,因为如果TRUNC(TSTAMP) >= TRUNC(SYSDATE - 1),则TSTAMP >= TRUNC(SYSDATE - 1) 总是正确的(如果TSAMP 上有索引,删除它可能会提高性能)。跨度>
    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-15
      • 1970-01-01
      • 2021-09-27
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多