使用 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 table
和insert 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
上使用或不使用时间组件
- 是索引安全的。
我有一个连接查询,它查看 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')
- "remove" 时间分量,例如
你的第二次尝试是错误的(多余的单引号,010
(那是什么?))。
如果 Oracle 识别您使用的格式,第三个 可能 有效。
如果以上没有帮助,请post测试用例(create table
和insert 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
上使用或不使用时间组件
- 是索引安全的。