Oracle 查询 BETWEEN (date) AND (date)
Posted
技术标签:
【中文标题】Oracle 查询 BETWEEN (date) AND (date)【英文标题】:Oracle query BETWEEN (date) AND (date) 【发布时间】:2018-03-30 16:48:13 【问题描述】:我的表“消息”包含一个列名:message_date(数据类型:TIMESTAMP),它存储日期和时间。但在这种情况下,我只想显示数据的日期,所以我使用方法 to_char(case(message_date as date),'DD-MM-YYYY')
SELECT msg_id, msg_details, to_char(cast(message_date as date) ,'DD-MM-YYYY')as "DATE"
FROM message
WHERE message LIKE '%hi%'
AND to_char(cast(message_date as date), 'DD-MM-YYYY')
BETWEEN '15-01-2018'
AND '30-01-2018'
我只想显示日期 15-01-2018 和 30-01-2018 之间的行。但最后,查询结果出来的数据是 date 15 - 30..where 与其他月份的行(exp: 20-03-2018 也显示结果。我不知道为什么它只检查日期而不是月份和年份...... 寻求帮助..谢谢
【问题讨论】:
任何以'2'
开头的字符串都将落在字符串'15-01-2018'
和'30-01-2018'
之间,因为'2'
介于'1'
和'3'
之间。
【参考方案1】:
使用符合 ISO 格式的日期文字:
WHERE
message LIKE '%hi%' AND
message_date BETWEEN date '2018-01-15' AND date '2018-01-30'
您不需要将message_date
转换为文本,因为它已经是一个时间戳,可以直接与日期进行比较。
【讨论】:
@newlearner 抱歉,在回答之前我没有阅读您的其余问题。只需直接比较message_date
而无需转换为日期。【参考方案2】:
比较日期时使用BETWEEN
的唯一问题是,您要比较的一个或多个日期是否包含时间部分。例如,日期30-JAN-18 01.32.32 PM
肯定不在15-JAN-18
和30-JAN-18
之间——它比后一个日期更大(呃,更晚)。此外,在使用 BETWEEN
(包含在内)时,总有可能包含您不想要的边缘情况。我的建议是这样做:
SELECT msg_id, msg_details, TO_CHAR(message_date, 'DD-MM-YYYY') AS "DATE"
FROM message
WHERE message LIKE '%hi%'
AND message_date >= DATE'2018-01-15'
AND message_date < DATE'2018-01-30' + 1;
请注意,第一行中我删除了您的 CAST()
- 没有理由将日期值转换为 DATE
数据类型。在最后一行中,我使用了一些 Oracle 日期算法;这将给我所有日期,包括30-JAN-18 11:59.59.9999....
。
顺便说一句,您可能希望在WHERE
子句中将LOWER()
函数应用于message
:
WHERE LOWER(message) LIKE '%hi%'
否则您将错过包含Hi
、HI
、hI
等的消息。
【讨论】:
以上是关于Oracle 查询 BETWEEN (date) AND (date)的主要内容,如果未能解决你的问题,请参考以下文章