我的表“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 也显示结果。我不知道为什么它只检查日期而不是月份和年份... 寻求帮助..谢谢
答案 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-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....
。
另外,您可能希望在LOWER()
子句中将message
函数应用于WHERE
:
WHERE LOWER(message) LIKE '%hi%'
否则您将错过包含Hi
,HI
,hI
等的邮件。