between-two-dates返回两个日期相同的行,而不是两个日期之间的行

oewdyzsn  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(431)

我试图选择两个特定日期之间的行,但得到的是中指定的相同日期的行 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') 格式化以更新保留id列中的数据。但是,当我使用

and RESERVATION_DATE > to_date('15.03.2020','DD.MM.YYYY') 
and RESERVATION_DATE < to_date('26.05.2020','DD.MM.YYYY')

它什么也没回来
这是预订台

0pizxfdo

0pizxfdo1#

介于开始和结束之间的条件。
您可以使用操作符>和<来排除它。
你的例子简化了:

create table RESERVATION (
 RESERVATION_ID number
,RESERVATION_DATE date)

数据:

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

我假设预订日期是一个日期。始终使用显式数据类型转换。

hzbexzde

hzbexzde2#

我改变了日期格式,试试这个,如果你有其他结果告诉我。

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;
gcmastyq

gcmastyq3#

如果 RESERVATION_DATE 列的数据类型为 DATE ,不要将其与字符串进行比较,因为 '15-MAR-20' 是字符串。oracle将尝试隐式地将其转换为有效的日期值;有时它会成功,有时它会返回false值(因为它的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') . 这还不够-你应该尽可能提供格式掩码
2020年5月26日
2026年5月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

因为克罗地亚没有“梅”:

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

但这是可行的,正如我告诉甲骨文我想要的:

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 :
先设置环境
样本数据来自第1-9行
您需要的查询从第10行开始
干得好:

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>

相关问题