我有一个类型'creation_date'
的列'date'
,当我根据'creation_date'
查询我的表中的不同记录时,我得到了6条记录:
select distinct creation_date from test_table;
输出:
06-APR-11
06-APR-11
28-MAR-11
06-APR-11
06-APR-11
18-MAR-11
在此输出中,即使我在查询中使用了distinct,4月6日也会显示4次。此外,当我试图查找与creation_date
6th April 2011
匹配的所有记录时,我没有得到任何结果。以下是我的询问:
select * from test_table where creation_date = to_date('06-APR-11','DD-MON-YY');
请帮助我在这些两个查询中出错。
答案 0 :(得分:6)
问题是双重的。首先,日期几乎肯定有时间成分。 to_date('06-MAR-11','DD-MON-YY')
相当于2011/03/06 00:00:00
。如果您使用TRUNC()
功能,您将能够看到当天的所有内容:
select *
from test_table
where trunc(creation_date) = to_date('06-MAR-11','DD-MON-YY');
我不使用MON datetime format model。正如我解释here,这取决于您的地区和设置。使用数字月份格式模型更安全。同样,始终将世纪指定为年度的一部分。
where trunc(creation_date) = to_date('06-03-YY11','DD-MM-YYYY');
你的第二个问题几乎肯定是你的NLS_DATE_FORMAT;它似乎没有考虑到时间,因此你看到4个相同的日期。这仅控制显示数据的方式而不是如何存储。
您可以使用以下内容进行更改:
ALTER SESSION SET NLS_DATE_FORMAT = "DD/MM/YYYY HH24:MI:SS"
如果我使用以下方法设置测试环境:
create table test_table ( creation_date date );
insert into test_table values ( sysdate );
insert into test_table values ( sysdate - 0.01 );
alter session set nls_date_format = "YYYY/MM/DD";
您可以看到返回的数据不包括时间(虽然SYSDATE确实如此):
SQL> select * from test_table;
CREATION_D
----------
2013/04/12
2013/04/12
更改NLS_DATE_FORMAT并执行相同的SELECT,您现在可以获得时间组件:
SQL> alter session set nls_date_format = "YYYY/MM/DD HH24:MI:SS";
Session altered.
SQL> select * from test_table;
CREATION_DATE
-------------------
2013/04/12 12:48:41
2013/04/12 12:34:17
最后,当试图单独选择今天的日期时,不会返回任何行:
SQL> select *
2 from test_table
3 where creation_date = to_date('20130412','yyyymmdd');
no rows selected
但是,当使用TRUNC()
仅比较字段的日期部分时,您会再次获得所有行:
SQL> select *
2 from test_table
3 where trunc(creation_date) = to_date('20130412','yyyymmdd');
CREATION_DATE
-------------------
2013/04/12 12:48:41
2013/04/12 12:34:17
要真正回答第二个问题,如果您想要唯一日期,可以重复使用TRUNC()
功能:
select distinct trunc(creation_date)
from test_table
答案 1 :(得分:1)
DATE数据类型存储年份(包括世纪),月份,日期,小时,分钟和秒(午夜之后)。你也必须考虑这一点。