Sql 通过只知道日期而不知道时间(ORACLE)从表中选择
我试图通过知道列中的日期包含日期和时间来从表中检索记录 假设我有一个名为Sql 通过只知道日期而不知道时间(ORACLE)从表中选择,sql,oracle,date,Sql,Oracle,Date,我试图通过知道列中的日期包含日期和时间来从表中检索记录 假设我有一个名为t1的表,它分别只包含两列name和date 存储在日期列中的数据如下8/3/2010 12:34:20 PM 例如,我想通过此查询检索此记录(注意,我不花时间): 这个问题什么也没给我 如何通过只知道日期而不知道时间来检索日期呢?您可以使用between函数来获取2010-08-03 00:00:000到2010-08-03 23:59:59:000之间的所有记录日期在Oracle中是一个保留关键字,因此我使用列名您的日期
t1
的表,它分别只包含两列name
和date
存储在日期列中的数据如下8/3/2010 12:34:20 PM
例如,我想通过此查询检索此记录(注意,我不花时间):
这个问题什么也没给我
如何通过只知道日期而不知道时间来检索日期呢?您可以使用between函数来获取2010-08-03 00:00:000到2010-08-03 23:59:59:000之间的所有记录
日期在Oracle中是一个保留关键字,因此我使用列名您的日期
如果你的日期有索引,我会使用
WHERE your_date >= TO_DATE('2010-08-03', 'YYYY-MM-DD')
AND your_date < TO_DATE('2010-08-04', 'YYYY-MM-DD')
如果没有索引或记录不太多
WHERE TRUNC(your_date) = TO_DATE('2010-08-03', 'YYYY-MM-DD')
应该足够了。不带参数从日期中删除小时、分钟和秒
如果性能真的很重要,考虑把这个列为:
CREATE INDEX trunc_date_idx ON t1(TRUNC(your_date));
试试下面的方法
就我个人而言,我通常会:
select *
from t1
where date between trunc( :somedate ) -- 00:00:00
and trunc( :somedate ) + .99999 -- 23:59:59
将日期列转换为正确的格式并进行比较:
SELECT * From my_table WHERE to_char(my_table.my_date_col,'MM/dd/yyyy') = '8/3/2010'
这部分
to_char(my_table.my_date_col,'MM/dd/yyyy')
将生成字符串“8/3/2010”trunc(my_date,'DD')
将在Oracle中只给出日期而不是时间。只需使用此字符串:
从t1中选择*日期(日期列)='8/3/2010'
介于
之间意味着
>=和良好捕获,固定。你的回答要彻底得多+1。对不起,这不适用于Oracle。给我一个ORA-00936:missing expression
;单引号用于字符串文字。Date()在Oracle中不起作用。例如,从dual中选择日期(sysdate)代码>**第1行错误:ORA-00936:缺少表达式**@Abdulrhman-您应该接受对您有效的答案!trunk()工作起来很有魅力,像巧克力一样甜!我应该早点读你的帖子。@SergiyKolesnikov:我不知道这会发生什么,请看一看一个查询返回的行,而不是另一个查询返回的行,并尝试调查发生了什么。顺便说一句,没有TRUNK+TO_DATE起作用!因为写那些yyyymmddhhmms不是很好,所以也更容易format@ACV:它与我的测试一起使用,但它取决于您的表统计信息以及优化器对给定范围所期望的行的百分比。必须小心使用此方法。在需要日期范围时,请选择“yyyy/mm/mm”。您是否在oracle中测试了此查询?
select *
from t1
where date between trunc( :somedate ) -- 00:00:00
and trunc( :somedate ) + .99999 -- 23:59:59
SELECT * From my_table WHERE to_char(my_table.my_date_col,'MM/dd/yyyy') = '8/3/2010'
to_char(my_table.my_date_col,'MM/dd/yyyy')