通过只知道没有时间的日期从表中选择 (ORACLE)

Posted

技术标签:

【中文标题】通过只知道没有时间的日期从表中选择 (ORACLE)【英文标题】:Select from table by knowing only date without time (ORACLE) 【发布时间】:2011-01-24 21:05:48 【问题描述】:

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

假设我有一个名为t1 的表,它分别只包含两列namedate

日期列中存储的数据像这样8/3/2010 12:34:20 PM

例如,我想通过这个查询来检索这条记录(注意我没有放时间):

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

这个查询什么也没给我!

如果只知道date 而没有时间,如何检索date

【问题讨论】:

【参考方案1】:

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

【讨论】:

@Abdulrhman - 你应该接受对你有用的答案! trunk() 像魅力一样工作,像巧克力一样甜美!我应该早点看你的帖子。 @SergiyKolesnikov:我不明白这是怎么发生的,请查看一个查询而不是另一个查询返回的行,并尝试调查会发生什么。顺便说一句,没有&lt;=,只有&lt; TRUNK + TO_DATE 有效!也更容易,因为它不太好写那些 YYYYMMDDHHMMSS 格式 @ACV:它与我的测试一起使用,但它取决于您的表统计信息以及优化器在给定范围内期望的行百分比。【参考方案2】:

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

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'

【讨论】:

必须小心这种方法。相反,当您需要日期范围时选择“yyyy/mm/MM”【参考方案3】:

就个人而言,我通常会选择:

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

【讨论】:

【参考方案4】:

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

【讨论】:

BETWEEN 表示&gt;= AND &lt;=,因此您的查询也会返回带有date = 2010-08-04 00:00:00 的行。 不错,已修复。您的回答更加彻底 +1。【参考方案5】:

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

【讨论】:

【参考方案6】:

只需使用这个:

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

【讨论】:

你在 oracle 中测试过这个查询吗?【参考方案7】:

试试下面的方法。

Select * from t1 where date(col_name)="8/3/2010" 

【讨论】:

抱歉,这不适用于 Oracle。给我一个ORA-00936: missing expression 在Oracle中,双引号用于分隔标识符;单引号用于字符串文字。 Date() 在 Oracle 中不起作用。例如,SELECT date(sysdate) FROM dual; **ERROR at line 1:ORA-00936: missing expression **

以上是关于通过只知道没有时间的日期从表中选择 (ORACLE)的主要内容,如果未能解决你的问题,请参考以下文章

根据日期参数从表中选择周末或工作日数据

Yii2 Oracle 日期列

Yii2 Oracle日期列

从表中选择所有的 Oracle 函数

从表中选择具有最大日期的行

用于从表中选择具有最新时间戳的行的 JOOQ 代码