只通过日期而非时间从表中选择数据 (ORACLE)

58

我正在尝试通过知道包含日期和时间的列中的日期来检索表中的记录。

假设我有一个名为t1的表,其中仅包含两列,分别是namedate

date中存储的数据格式为8/3/2010 12:34:20 PM

例如,我想通过以下查询检索此记录(请注意,我没有放置时间):

Select * From t1 Where date="8/3/2010"

这个查询结果为空!

如果只知道日期而不知道时间,如何检索date

7个回答

123

DATE 是 Oracle 中的保留关键字,因此我使用列名 your_date 代替它。

如果您在 your_date 上有索引,那么我会使用:

WHERE your_date >= TO_DATE('2010-08-03', 'YYYY-MM-DD')
  AND your_date <  TO_DATE('2010-08-04', 'YYYY-MM-DD')

或者BETWEEN

WHERE your_date BETWEEN TO_DATE('2010-08-03', 'YYYY-MM-DD')
                    AND TO_DATE('2010-08-03 23:59:59', 'YYYY-MM-DD HH24:MI:SS')
如果没有索引或记录不太多。
WHERE TRUNC(your_date) = TO_DATE('2010-08-03', 'YYYY-MM-DD')
应该足够了。无参数的TRUNC函数可以从DATE中去除小时、分钟和秒。
如果性能真的很重要,考虑在该列上放置一个基于函数的索引(Function Based Index)
CREATE INDEX trunc_date_idx ON t1(TRUNC(your_date));

1
@Abdulrhman - 你应该接受对你有用的答案! - Leslie
trunk() 很顺利,就像巧克力一样甜美!我早该读你的文章了。 - andre_northwind
@SergiyKolesnikov:我不明白这是怎么发生的,请查看一下一个查询返回的行,而另一个查询没有返回的行,并尝试调查发生了什么。顺便说一下,这里没有“<=”,只有“<”。 - Peter Lang
TRUNK + TO_DATE 有效!这样做还更方便,因为不用再写那些 YYYYMMDDHHMMSS 格式了。 - davidwillianx
1
@ACV:它用于我的测试,但它取决于您表格的统计信息以及优化器对于给定范围所期望的行百分比。 - Peter Lang
显示剩余2条评论

5

个人而言,我通常选择:

select * 
from   t1
where  date between trunc( :somedate )          -- 00:00:00
            and     trunc( :somedate ) + .99999 -- 23:59:59

5

将您的日期列转换为正确的格式并进行比较:

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')

将会得到字符串 '2010年8月3日'

使用这种方法必须小心。相反,当您需要日期范围时,请选择“yyyy/mm/MM”。 - Yury Euceda

3

trunc(my_date,'DD')会在Oracle中只给出日期而不是时间。


2
您可以使用between函数来获取2010-08-03 00:00:00:000和2010-08-03 23:59:59:000之间的所有记录。

3
"BETWEEN"的含义是“>=并且<=”,因此您的查询还将返回日期为“2010-08-04 00:00:00”的行。 - Peter Lang
好的,已修复。你的回答更加详细,加一。 - Dustin Laine

0

只需使用这个:

select * from t1 where to_date(date_column)='8/3/2010'

你在Oracle中测试过这个查询吗? - Manjeet
在Oracle中,这个查询会导致一个错误:ORA-01843:不是有效的月份 - Paul Stoner

-1
尝试以下方法。
Select * from t1 where date(col_name)="8/3/2010" 

3
抱歉,这在 Oracle 中无法运行。会产生 ORA-00936: 缺失表达式 的错误提示。 - Peter Lang
1
在Oracle中,双引号用于分隔标识符;单引号用于字符串字面值。 - Jeffrey Kemp
1
Date() 在 Oracle 中无法使用。例如,SELECT date(sysdate) FROM dual; 在第 1 行出现错误:ORA-00936:缺少表达式 - NoelProf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接