我正在尝试运行以下查询以选择两个日期之间的一些结果,但由于条件不存在,我得到了结果。那么这里有什么问题呢?
select OPEN_TIME, STATUS
from PROBSUMMARY
where trunc (open_time) >= '01-01-2020'
and trunc (open_time) < '01-01-2021'
我正在尝试运行以下查询以选择两个日期之间的一些结果,但由于条件不存在,我得到了结果。那么这里有什么问题呢?
select OPEN_TIME, STATUS
from PROBSUMMARY
where trunc (open_time) >= '01-01-2020'
and trunc (open_time) < '01-01-2021'
您正在将日期与字符串进行比较;日期被转换为字符串来进行比较。从文档中:
在
SELECT FROM
操作期间,Oracle 将列中的数据转换为目标变量的类型。
当您的日期被隐式转换为字符串时,它们都在字符串值的范围内,基于字符值比较规则。
以上当然不是真的;这取代了它:
在将字符值与
DATE
值进行比较时,Oracle 将字符数据转换为DATE
.
因此,隐式转换中发生了一些奇怪的事情,这取决于您的NLS_DATE_FOPRMAT
设置。无论如何,以下建议仍然有效......
将日期与日期进行比较,to_date()
使用日期文字或日期文字转换您的字符串:
where open_time >= date '2020-01-01' and open_time < date '2021-01-01'
您不需要将日期截断回午夜;如果合适的话,这将有助于能够使用索引。
试试这个,
SELECT OPEN_TIME, STATUS
FROM PROBSUMMARY
WHERE OPEN_TIME < '01-01-2020' AND OPEN_TIME > '01-01-2021';
以上条件 start_date 包括日期但 end_date 不包括,因为包括两个日期,您必须使用=
.
确保您的通过日期必须遵循 mysql 的语法。