我在我的机器上使用Oracle XE 将表定义为:
Name Type
ENAME VARCHAR2(20)
DOJ DATE
点击一个简单的选择:
从test1.tasty1;
中选择*
ENAME DOJ
sat 08-DEC-16
好的 - 我知道DATE字段中有时间组件。
使用TRUNC的以下查询工作正常:
从test1.tasty1中选择*,其中trunc(DOJ)='08 -DEC-16';
现在我想测试'to_date'函数 - 但是以下查询都没有工作 - 想知道为什么?
从test1.tasty1中选择*,其中DOJ = TO_DATE('08 -12-2016' , 'DD-MM-YYYY');
从test1.tasty1中选择* DOJ = to_date('08 -DEC-2016','DD-MON-YYYY');
选择*来自 test1.tasty1其中DOJ = to_date('08 -DEC-16','DD-MON-YY');
选择 *来自test1.tasty1,其中DOJ = to_date('08 -DEC-16','dd-mon-RR');
在SO上看了以下内容:
Oracle TO_DATE not working
所以不确定这里有什么问题?
答案 0 :(得分:1)
您是否尝试过这样做,因为日期与日期的比较是正确的:
select * from test1.tasty1 where to_date(DOJ,'DD-MM-YYYY') = to_date('08-12-2016','DD-MM-YYYY');
比较苹果和苹果,而不是芒果。
答案 1 :(得分:0)
从您的问题和评论中看来,这是发生的事件序列。
您在表格中执行了以下INSERT
:
INSERT INTO test1.tasty1 VALUES ('sat', SYSDATE)
请记住,Oracle中的日期包含日期和时间组件。因此,即使你确实插入了日期'2016-12-08'
,你也插入了一个时间组件。因此,以下查询不会返回任何记录:
SELECT * FROM test1.tasty1 WHERE DOJ = '2016-08-12'
这可能是因为您从未指定过时间组件,因此您之前插入的记录不匹配。如果您只想比较日期部分,可以使用TRUNC
,如下所示:
SELECT * FROM test1.tasty1 WHERE TRUNC(DOJ) = '2016-08-12'
如果您真的只想处理日期组件,那么向前推进的问题的解决方案是在插入期间用SYSDATE
包裹TRUNC
。
顺便说一下,用作文字的格式'08-DEC-16'
将不会被Oracle识别为有效日期。相反,请使用'2016-12-08'
。