我试图选择两个特定日期之间的行,但我得到的行是在 BETWEEN
来代替。我试过使用运算符>和<,但似乎没有任何效果。这是否与日期格式有关?
SELECT r.RESERVATION_ID, a.AGENT_ID, a.AGENT_FNAME AS AGENT_NAME, t.TRIP_ID,
s.RESERVATION_STATUS
FROM RESERVATION r
INNER JOIN AGENT a
ON
a.AGENT_ID=r.AGENT_ID
INNER JOIN TOURTRIP_RESERVATION t
ON
r.RESERVATION_ID=t.RESERVATION_ID
INNER JOIN RESERVATION_STATUS s
ON
r.RESERVATION_STATUSID=s.RESERVATION_STATUSID
WHERE r.AGENT_ID IS NOT NULL
AND r.RESERVATION_DATE BETWEEN '15-MAR-20' AND '26-MAY-20'
AND r.RESERVATION_STATUSID=100;
我使用了 to_date('03.06.2020','DD.MM.YYYY')
格式来更新 reservation_id 列中的数据。然而,当我使用
and RESERVATION_DATE > to_date('15.03.2020','DD.MM.YYYY')
and RESERVATION_DATE < to_date('26.05.2020','DD.MM.YYYY')
无功而返
这是预约表
状况 之间 包括开始和结束。你可以使用运算符>和<来排除它。 你的例子简化了。
create table RESERVATION (
RESERVATION_ID number
,RESERVATION_DATE date)
Data.查询A)
insert into RESERVATION values (1, to_date('01.06.2020','DD.MM.YYYY'));
insert into RESERVATION values (2, to_date('02.06.2020','DD.MM.YYYY'));
insert into RESERVATION values (3, to_date('03.06.2020','DD.MM.YYYY'));
查询A)
select RESERVATION_ID
from RESERVATION
where RESERVATION_DATE between to_date('01.06.2020','DD.MM.YYYY')
and to_date('03.06.2020','DD.MM.YYYY')
将返回。
1
2
3
查询B)
select RESERVATION_ID
from RESERVATION
where RESERVATION_DATE > to_date('01.06.2020','DD.MM.YYYY')
and RESERVATION_DATE < to_date('03.06.2020','DD.MM.YYYY')
将返回
2
我想 保留日期 是一个日期。总是使用显式数据类型转换。
我改变了日期格式,试试这个,如果你有其他结果,告诉我。
SELECT r.RESERVATION_ID, a.AGENT_ID, a.AGENT_FNAME AS AGENT_NAME, t.TRIP_ID,
s.RESERVATION_STATUS
FROM RESERVATION r
INNER JOIN AGENT a
ON
a.AGENT_ID=r.AGENT_ID
INNER JOIN TOURTRIP_RESERVATION t
ON
r.RESERVATION_ID=t.RESERVATION_ID
INNER JOIN RESERVATION_STATUS s
ON
r.RESERVATION_STATUSID=s.RESERVATION_STATUSID
WHERE r.AGENT_ID IS NOT NULL
AND r.RESERVATION_DATE BETWEEN '2020-03-15' AND '2020-05-26'
AND r.RESERVATION_STATUSID=100;
如果 RESERVATION_DATE
列的数据类型是 DATE
不要把它和字符串相提并论,因为... ... '15-MAR-20'
是一个字符串。Oracle会尝试隐式地将其转换为有效的日期值;有时会成功,有时会返回假值(因为它的NLS设置与你提供的不同),有时会失败并引发一个错误。
这两种情况。
date '2020-03-15'
to_date('15.03.2020', 'dd.mm.yyyy')
另一方面,是... 日期.
BETWEEN
是 包容性 并将同时返回 极限如果他们存在的话
AND r.RESERVATION_DATE BETWEEN date '2020-03-15' and date '2020-05-26'
如果你想 排除 那么
AND r.RESERVATION_DATE > date '2020-03-15'
AND r.RESERVATION_DATE < date '2020-05-26'
但是,如果 RESERVATION_DATE
是一个 VARCHAR2
列,你犯了一个大错误。千万不要把日期存储为字符串。如果你不忍心修改数据类型,那么你就得把它转换为日期。
and to_date(r.reservation_date, 'dd-mon-yy') between date '2020-03-15'
and date '2020-05-26'
这个 行得通 只要该列中没有任何无效的值。因为,由于它是一个字符串,你可以把类似于 15-AA-2F
这当然不是一个日期,但可以存储到这样一个列中。这样的话,查询就会失败,你就得修正数据。
你发布的评论说你尝试了 TO_DATE('26-MAY-20')
. 这还不够--你应该提供格式掩码,因为这可以是
而且这取决于NLS的设置。此外,在我的数据库中也会失败。
因为NLS的设置不同
SQL> select to_date('26-may-20') from dual;
select to_date('26-may-20') from dual
*
ERROR at line 1:
ORA-01858: a non-numeric character was found where a numeric was expected
因为在克罗地亚没有 "may "这个词。
SQL> select to_date('26-may-20', 'dd-mon-yy') from dual;
select to_date('26-may-20', 'dd-mon-yy') from dual
*
ERROR at line 1:
ORA-01843: not a valid month
但这是可行的,因为我告诉了Oracle我想要的东西。
SQL> select to_date('26-may-20', 'dd-mon-yy', 'nls_date_language = english') from dual;
TO_DATE('26-MAY-20'
-------------------
26.05.2020 00:00:00
更好的办法是,只用数字或日期字面(这总是一个字)。date 'yyyy-mm-dd'
):
SQL> select to_date('26.05.2020', 'dd.mm.yyyy') d1,
2 date '2020-05-26' d2
3 from dual;
D1 D2
------------------- -------------------
26.05.2020 00:00:00 26.05.2020 00:00:00
SQL>
根据你提供的样本数据,假设: reservation_date
列的数据类型是 date
:
给你
SQL> alter session set nls_date_language = 'english';
Session altered.
SQL> alter session set nls_Date_format = 'dd-mon-yy';
Session altered.
SQL> with reservation (reservation_id, reservation_date, agent_id) as
2 (select 8576, date '2020-03-15', 222 from dual union all
3 select 7325, date '2020-05-26', 333 from dual union all
4 select 3186, date '2020-04-23', 111 from dual union all
5 select 8000, date '2020-04-05', 555 from dual union all
6 select 4120, date '2020-01-03', null from dual union all
7 select 1546, date '2020-02-15', null from dual union all
8 select 1007, date '2020-05-06', null from dual
9 )
10 select *
11 from reservation
12 where reservation_date between date '2020-03-15'
13 and date '2020-05-26'
14 order by reservation_date;
RESERVATION_ID RESERVATI AGENT_ID
-------------- --------- ----------
8576 15-mar-20 222
8000 05-apr-20 555
3186 23-apr-20 111
1007 06-may-20
7325 26-may-20 333
SQL>