Oracle 在 DATE 使用 LIKE '%'

Oracle use LIKE '%' on DATE

我的 table myTab 有列 startDate,其数据类型为 "DATE"。此列中的数据存储为 dd.mm.yyyy.

现在我正在尝试通过此查询获取数据:

SELECT * FROM myTab WHERE startDate like '%01.2015"

不知何故它不起作用,我不知道为什么。

希望有人能提供帮助。

要对日期进行文本搜索,您必须将日期转换为文本。

如果您计算要查找的内容的第一个日期和最后一个日期并获取它们之间的所有内容,效率会更高。这样它就完成了数字比较而不是文本模式匹配,并且如果有索引,它可以使用索引:

SELECT * FROM myTab WHERE startDate >= DATE '2015-01-01' AND startDate < DATE '2015-02-01'

如果字段类型是"DATE",则该值不是以字符串形式存储的,它是由Oracle 管理的数字,因此您必须将其转换为字符串:

SELECT * FROM myTab WHERE to_char(startDate, 'MM.YYYY') = '01.2015';

您还可以在 SQL 查询中使用日期范围:

SELECT * FROM myTab 
WHERE startDate 
BETWEEN to_date('01.01.2015', 'DD.MM.YYYY') 
AND     to_date('31.01.2015', 'DD.MM.YYYY');
SELECT * FROM myTab WHERE TO_CHAR(startDate,'dd.mm.yyyy') LIKE '%01.2015'

关于你的实际问题"Somehow it doesn't work and I don't know why."

Oracle 进行从 DATEVARHCAR2 的隐式转换,但它使用默认值 NLS_DATE_FORMAT,这可能与您在查询中使用的不同。

The data in this column are stored like dd.mm.yyyy.

Oracle 不会以您看到的格式存储日期。它以 7 个字节的专有格式在内部存储它,每个字节存储日期时间值的不同组成部分。

WHERE startDate like '%01.2015"

您正在比较 DATESTRING,这是毫无意义的。

性能的角度,您应该使用日期范围条件,这样如果有任何常规日期列上的 INDEX,它将被使用。

SELECT * FROM table_name WHERE date_column BETWEEN DATE '2015-01-01' AND DATE '2015-02-01'

要了解为什么 日期范围条件 性能 方面更好,请查看我的回答 .

我就是这样解决了我的问题。感谢您提出改进建议。 C# 中的示例。

string dd, mm, aa, trc, data;
dd = nData.Text.Substring(0, 2);
mm = nData.Text.Substring(3, 2);
aa = nData.Text.Substring(6, 4);
trc = "-";
data = aa + trc + mm + trc + dd;

"Select * From bdPedidos Where Data Like '%" + data + "%'";

提供更详细的答案并解决这个 答案的问题。

在 Oracle 中,"date" 类型的列既不是数字也不是字符串,它是具有年月日时分秒的 "datetime" 值。 默认时间始终为午夜“00:00:00”

查询:

Select * From bdPedidos Where Data Like '%" + data + "%'" 

并非在所有情况下都有效,因为日期列不是字符串,使用 "like" 会强制 Oracle 将日期值转换为字符串值。 字符串值可能是年-月-日-时间或月-日-年-时间或日-月-年-时间,这完全取决于特定 Oracle 实例如何设置参数 NLS_DATE_FORMAT 以将日期显示为字符串。

涵盖一天中所有可能时间的正确方法是:

Select * 
From bdPedidos 
Where Data between to_date('" + data + " 00:00:00','yyyy-mm-dd hh24:mi:ss')
               and to_date('" + data + " 23:59:59','yyyy-mm-dd hh24:mi:ss')
SELECT * FROM myTab WHERE startDate like '%-%-2015';

这将搜索 2015 年的所有日期。如果这不起作用,请尝试:

SELECT * FROM myTab WHERE startDate like '%-%-15';