Oracle查询BETWEEN(日期)和(日期)

时间:2018-03-30 16:48:14

标签: sql oracle oracle11g

我的表“Message”包含一个列名:message_date(datatype: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 之间的行。但最终,查询结果显示的数据来自日期15 - 30 ..其中行与其他月份(exp: 20-03-2018 也显示结果。我不知道为什么它只检查日期而不是月份和年份... 寻求帮助..谢谢

2 个答案:

答案 0 :(得分:1)

将日期文字与ISO兼容格式的日期一起使用:

WHERE
    message LIKE '%hi%' AND
    message_date BETWEEN date '2018-01-15' AND date '2018-01-30'

Notr您不需要将message_date投射到文字中,因为它已经是时间戳,可以直接与日期进行比较。

答案 1 :(得分:0)

比较日期时使用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....

另外,您可能希望在LOWER()子句中将message函数应用于WHERE

 WHERE LOWER(message) LIKE '%hi%'

否则您将错过包含HiHIhI等的邮件。