使用 sysdate 时如何在查询中搜索日期

How do i search for a date in a query when sysdate has been used

我有一个连接查询,它查看 2 table 秒并引入时间范围内的日期。我在插入数据时使用了 sysdate。当我 select 来自 table 的数据时,我能够看到日期,但是,我不确定如何按日期过滤数据。

我在查询结束时尝试过,但没有收到任何行 selected:

where dateofstart = '04-MAY-20';

我也试过:

 where dateofstart = 'date '2020-05-010';

最后,我试过了:

 dateofstart between '10-May-20' and '16-May-20';

我正在使用 SQL Plus。

如果您按原样使用SYSDATE ,它是一个包含日期和时间的函数,例如

SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi:ss';

Session altered.

SQL> select sysdate from dual;

SYSDATE
-------------------
06.05.2020 07:20:38

SQL>

并存储在您的 table 中(我假设该列的数据类型是 DATE)。

因此,如果您搜索 where dateofstart = '04-MAY-20',您犯了两个错误:

  • 您正在将 DATE 数据类型列与字符串进行比较。是的,'04-MAY-20'是一个字符串;它对你我来说看起来像日期,但对 Oracle 来说它只是一个字符串。 Oracle 尝试使用 NLS 设置将其隐式转换为日期值;有时会成功,有时不会。因此,您应该始终 使用日期,而不是依赖可能的转换成功。
    • 假设您将 dateofstart'01/02/03' 进行了比较; 01 是什么?今天是(可能是)吗?月份(也可以)?年份(当然,为什么不)?但是,如果你使用
      • 日期字面量,始终采用 yyyy-mm-dd 格式,例如日期 '2001-03-02',每个人(包括 Oracle)都会知道它是 2001 年 3 月 2 日
      • TO_DATE 函数,例如to_date('01/02/03', 'yy/dd/mm')
  • 因为您的列包含日期 时间,只有当 dateofstart 值恰好存储在开始时的午夜时,您才会得到一些行那天的。如果不是,要么

    • "remove" 时间分量,例如where trunc(dateofstart) = date '2020-05-04'(这将在 dateofstart 不可用 上使用索引(如果存在),除非您创建基于函数的索引),或
    • 使用between,例如

      where dateofstart between to_date('04.05.2020 00:00:00', 'dd.mm.yyyy hh24:mi:ss') 
                            and to_date('04.05.2020 23:59:59', 'dd.mm.yyyy hh24:mi:ss')
      

你的第二次尝试是错误的(多余的单引号,010(那是什么?))。

如果 Oracle 识别您使用的格式,第三个 可能 有效。


如果以上没有帮助,请post测试用例(create tableinsert into几个示例记录)(编辑您写的原始消息)以便我们可以看看你做了什么。

既然你不能准确匹配你插入的时间,那么你应该截断日期:

where trunc(dateofstart) = '04-MAY-20';

我强烈建议您不要将 between 与日期一起使用,尤其是在 Oracle 中,它们具有时间组件。索引安全的最简单方法是:

where dateofstart >= date '2020-05-10' and
      dateofstart < date '2020-06-16' + interval '1' day

这个:

  • 可读
  • 使用标准日期文字
  • 不需要向比较日期添加时间部分
  • dateofstart
  • 上使用或不使用时间组件
  • 是索引安全的。