2 回答
TA贡献1816条经验 获得超6个赞
日期始终具有以下组成部分:年、月、日、小时、分钟和秒。用户界面并不总是显示所有这些组件(但它们仍然始终存在)。
如果您的TRACE_ON列有日期2019-09-05T12:34:56并且您正在尝试查看它是否是,BETWEEN '05-SEP-19' AND '05-SEP-19'那么 Oracle 将(假设匹配NLS_DATE_FORMAT会话参数)将字符串转换为午夜的日期并且2019-09-05T12:34:56 BETWEEN 2019-09-05T00:00:00 AND 2019-09-05T00:00:00为假,因此不会返回该行。
将您的查询更改为:
SELECT
-- ...
TO_CHAR( TRACE_ON, 'YYYY-MM-DD HH24:MI:SS' ),
-- ...
FROM (
SELECT
-- ...
FROM GUEST_RSV_TRACES
INNER JOIN NAME_RESERVATION
ON ( guest_rsv_traces.resv_name_id = name_reservation.resv_name_id )
WHERE trace_on >= TO_DATE( '$desde', 'DD-MON-RR' )
AND trace_on < TO_DATE( '$hasta', 'DD-MON-RR' ) + INTERVAL '1' DAY
AND -- ...
GROUP BY
-- ...
)
TA贡献1830条经验 获得超9个赞
如果要与这些“日期”进行比较的列是DATE数据类型,则不应将其与strings进行比较,因为'05-SEP-19'(以及所有其他值)是字符串,而不是日期。不要依赖隐式转换 - 使用to_date函数或日期文字。
例如:
between date '2019-09-05' and date '2019-09-05'
或(假设您的 NLS 设置设置为英语)
between to_date('05-sep-19', 'dd-mon-rr') and to_date('05-sep-19', 'dd-mon-rr')
因为,如果你做对了,那么在预期的工作之间。看一看:
SQL> create table test (id, datum) as
2 select 1, date '2019-09-04' from dual union all
3 select 2, date '2019-09-05' from dual union all --> this ...
4 select 3, date '2019-09-05' from dual union all --> ... and this are between 05.09.2019 and 05.09.2019
5 select 4, date '2019-09-06' from dual;
Table created.
SQL> alter session set nls_date_Format = 'dd.mm.yyyy';
Session altered.
SQL> select * From test
2 where datum between date '2019-09-05' and date '2019-09-05';
ID DATUM
---------- ----------
2 05.09.2019
3 05.09.2019
SQL>
- 2 回答
- 0 关注
- 385 浏览
添加回答
举报