2013-04-12 79 views
0

我有一列'creation_date'這是'date'類型的,當我基於'creation_date'我收到6條查詢我的表中重複的記錄:與日期在Oracle SQL比較

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 

在這個輸出中,即使當我在查詢中使用不同時,4月6日也會顯示4次。另外,當我試圖找出與creation_date6th April 2011匹配的所有記錄時,我都沒有收到任何結果。下面是我的查詢:

select * from test_table where creation_date = to_date('06-APR-11','DD-MON-YY'); 

請幫我在哪裏,我在這查詢做錯了。

+1

@chaithanya:大部分數據庫都使用Timestamp,所以看看它會在稍後幫助你。 – SenthilPrabhu

回答

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

DATE數據類型存儲年份(包括世紀),月份,日期,小時數,分鐘數和秒數(午夜後)。你還必須考慮這一點。