我的表myTab
有一列startDate
,它的数据类型是“DATE”。这个列中的数据存储为dd.mm.yyyy
格式。
现在我正在尝试使用以下查询获取数据:
SELECT * FROM myTab WHERE startDate like '%01.2015"
不知何故它不起作用,我不知道为什么。
希望有人能帮忙。
我的表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'
B*Tree索引
(如果有的话)。 - Lalit Kumar BSELECT * FROM myTab WHERE TO_CHAR(startDate,'dd.mm.yyyy') LIKE '%01.2015'
如果字段类型为“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');
DATE
隐式转换为VARHCAR2
,但它使用默认的NLS_DATE_FORMAT
,这可能与你在查询中使用的格式不同。SELECT * FROM table_name WHERE date_column BETWEEN DATE '2015-01-01' AND DATE '2015-02-01'
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')
我用这种方法解决了我的问题。感谢您提供的改进建议。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 + "%'";
SELECT * FROM myTab WHERE startDate like '%-%-2015';
这将搜索2015年的所有日期。如果不起作用,请尝试:
SELECT * FROM myTab WHERE startDate like '%-%-15';
where to_char(startDate ,'Mon-YYYY')='Jan-2015';
。 - Mihai