我的表结构有一个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';
我无法找出任何解决方案。 任何建议都会有所帮助。
答案 0 :(得分: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日期文字,但您的第二个查询是错误的。 始终,使用to_date
函数将字符串显式转换为日期。
SELECT * FROM TEST_DATE WHERE EMP_DATE = to_date('01-07-2012','dd-mm-yyyy');
我使用mm
datetime format model代替mon
,因为无法保证JUL
永远都是7月;它取决于您的NLS参数,您的特定数据库或会话使用的“日期语言”。日期时间格式模型是告诉数据库您要将其转换为日期的任何字符串的格式。
如果您对第二个查询的ANSI语法感兴趣,那么:
SELECT * FROM TESt_DATE WHERE trunc(EMP_DATE) = DATE '2012-07-01'
必须采用这种格式(YYYY-MM-DD)才能正常工作。