我试图选择两个特定日期之间的行,但得到的是中指定的相同日期的行 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')
它什么也没回来
这是预订台
3条答案
按热度按时间0pizxfdo1#
介于开始和结束之间的条件。
您可以使用操作符>和<来排除它。
你的例子简化了:
数据:
查询(a)
将返回:
查询(b)
会回来的
我假设预订日期是一个日期。始终使用显式数据类型转换。
hzbexzde2#
我改变了日期格式,试试这个,如果你有其他结果告诉我。
gcmastyq3#
如果
RESERVATION_DATE
列的数据类型为DATE
,不要将其与字符串进行比较,因为'15-MAR-20'
是字符串。oracle将尝试隐式地将其转换为有效的日期值;有时它会成功,有时它会返回false值(因为它的nls设置与您提供的不同),有时它会失败并引发错误。这两个:
date '2020-03-15'
to_date('15.03.2020', 'dd.mm.yyyy')
另一方面,是日期。BETWEEN
包含并将返回两个限制(如果存在):如果你想排除这些限制
但是,如果
RESERVATION_DATE
是一个VARCHAR2
你犯了个大错。永远不要将日期存储为字符串。如果无法修改数据类型,则必须将其转换为日期:只要该列中没有任何无效值,就可以这样做。因为它是一根弦,你可以把
15-AA-2F
当然不是日期,但可以存储在这样的列中。在这种情况下,查询将失败,您必须修复数据。你发表的评论说你试过了
TO_DATE('26-MAY-20')
. 这还不够-你应该尽可能提供格式掩码2020年5月26日
2026年5月20日
这取决于nls设置。此外,它将在我的数据库中失败:
因为nls设置不同:
因为克罗地亚没有“梅”:
但这是可行的,正如我告诉甲骨文我想要的:
更好的是,只使用数字或日期文字(这总是一个
date 'yyyy-mm-dd'
):根据你提供的样本数据,假设
reservation_date
列的数据类型为date
:先设置环境
样本数据来自第1-9行
您需要的查询从第10行开始
干得好: