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-1830-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%'

否则您将错过包含HiHIhI 等的消息。

【讨论】:

以上是关于Oracle 查询 BETWEEN (date) AND (date)的主要内容,如果未能解决你的问题,请参考以下文章

使用 SQL Server 复制 Oracle 的 RANGE BETWEEN 窗口子句语法

Oracle数据库查询某段时间内时间段的数据

oracle查询当天数据

oracle 查询某个时间段数据

Oracle SQL LOOP(两个日期之间)和计数

oracle 查询时间段每一天日期。