我的表startDate
包含dd.mm.yyyy
列,其数据类型为“DATE”。此列中的数据存储为SELECT * FROM myTab WHERE startDate like '%01.2015"
。
现在我正在尝试使用此查询获取数据:
DrawingSheet
不知怎的,它不起作用,我不知道为什么。
希望有人可以提供帮助。
答案 0 :(得分:18)
要对日期进行文本搜索,您必须将日期转换为文本。
如果您计算要查找的内容的第一个和最后一个日期并获取它们之间的所有内容,则效率会更高。这样它就可以作为数字比较而不是文本模式匹配来完成,如果有一个索引,它可以使用索引:
SELECT * FROM myTab WHERE startDate >= DATE '2015-01-01' AND startDate < DATE '2015-02-01'
答案 1 :(得分:2)
如果字段类型为“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');
答案 2 :(得分:2)
def import
Model.import(params[:file]) if params[:file]
Model.create(model_params) if params[:model]
redirect_to root_url, notice: "Things imported."
end
答案 3 :(得分:1)
关于你的实际问题“不知怎的,它不起作用,我不知道为什么。”
Oracle进行从DATE
到VARHCAR2
的隐式转换,但它使用默认的NLS_DATE_FORMAT
,这可能与您在查询中使用的内容不同。
答案 4 :(得分:1)
此列中的数据存储为dd.mm.yyyy。
Oracle 不会以您看到的格式存储日期。它以内部专有格式存储在7个字节中,每个字节存储日期时间值的不同组件。
WHERE startDate,如'%01.2015“
您正在将 DATE 与 STRING 进行比较,这是毫无意义的。
从效果的角度,您应该使用日期范围条件,以便在日期列中有任何常规 INDEX 时,它会被使用。
SELECT * FROM table_name WHERE date_column BETWEEN DATE '2015-01-01' AND DATE '2015-02-01'
要了解为什么日期范围条件在效果方面更好,请查看我的回答here。
答案 5 :(得分:0)
提供更详细的答案并解决此https://stackoverflow.com/a/42429550/1267661答案的问题。
在Oracle中,“date”类型的列不是数字也不是字符串,它是具有年,月,日,小时,分钟和秒的“日期时间”值。 默认时间始终是午夜“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')
答案 6 :(得分:0)
SELECT * FROM myTab WHERE startDate like '%-%-2015';
这将搜索2015年的所有日期。如果这不起作用,请尝试:
SELECT * FROM myTab WHERE startDate like '%-%-15';