0

我有一个具有 EMP_DATE 列的表结构,如下所示

 ID       EMP_DATE
----    -----------
5400     14-FEB-2012

我已将记录插入到下表中

INSERT INTO TEST_DATE VALUES(5400,SYSDATE);

在插入记录后,我试图获取那些没有选择行EMP_DATE 的人的记录。SYSDATE暂时让SYSDATE'01-JUL-2012'

 SELECT * FROM TEST_DATE WHERE EMP_DATE = SYSDATE;
                (OR)
 SELECT * FROM TESt_DATE WHERE EMP_DATE = '01-JUL-2012';

我无法找到任何解决方案。任何的意见都将会有帮助 。

4

1 回答 1

5

主要问题是日期包括小时、分钟和秒,这是您不允许的。如果你想要一天的所有东西,你可以使用这个trunc函数来得到这个:

SELECT * FROM TEST_DATE WHERE trunc(EMP_DATE) = trunc(SYSDATE);

默认情况下trunc,在对日期列进行操作时,会删除日期的时间部分。我通常会推荐一个功能索引trunc(emp_date)来优化这个查询。就像是:

create index i_test_date on test_date(trunc(emp_date));

我已经构建了一个小SQL Fiddle来演示这一点。

还有一个问题;尽管 Oracle 确实支持 ANSI 日期文字,但您的第二个查询是错误的。Always,使用该函数将字符串显式转换为日期to_date

SELECT * FROM TEST_DATE WHERE EMP_DATE = to_date('01-07-2012','dd-mm-yyyy');

我使用了mm datetime 格式模型,而不是mon因为不能保证它JUL总是意味着 7 月;这取决于您的 NLS 参数、您的特定数据库或会话使用的“日期语言”。日期时间格式模型是您如何告诉数据库您传递的要转换为日期的任何字符串的格式。


如果您对第二个查询的 ANSI 语法感兴趣,则为:

SELECT * FROM TESt_DATE WHERE trunc(EMP_DATE) = DATE '2012-07-01'

它必须采用这种格式 (YYYY-MM-DD) 才能工作。

于 2012-06-30T21:54:24.900 回答