2013-11-24 128 views
3

我想寫這個查詢檢索的按日期分組的記錄編號:使用SQL查詢與組按日期

SELECT system_date,count (is_paid) 
    FROM TPWEB.TP_CLIENT_TENDER_TRANS 
    where system_date between '1-DEC-12' and '31-DEC-12' 
    group by system_date 

但是,我得到的結果不進行分組,例如:

01-DEC-12 1 
01-DEC-12 1 
01-DEC-12 1 
01-DEC-12 1 

出了什麼問題...

+0

向我們展示了原始數據 – zzlalani

+1

會想出這個查詢'SELECT system_date,is_paid FROM TPWEB。TP_CLIENT_TENDER_TRANS 其中system_date在'1-DEC-12'和'31-DEC-12'之間 – zzlalani

+1

不清楚你的表模式是什麼,但我懷疑system_date是日期時間字段,而不是日期字段,這意味着你的分組工作不正確,還包括該領域的時間部分。 – nrathaus

回答

0

DATE Oracle中的列包含的精度可達毫秒,而不僅僅是日期。如果你只在日期本身有興趣,你應該TRUNC它來除去小時,分鐘,等:

SELECT system_date,COUNT (is_paid) 
FROM  TPWEB.TP_CLIENT_TENDER_TRANS 
WHERE system_date BETWEEN '1-DEC-12' AND '31-DEC-12' 
GROUP BY TRUNC(system_date, 'DD-MON-YY') 
3

正如documented的DATE數據類型是日期時間,因此存儲小時,分和秒除了你更合理的期望的屬性,在這個名稱的數據類型。如果你想計算一天,你需要刪除日期的時間部分。這是TRUNC()的默認行爲,所以要做到這一點trunc(<date>)是您所需要的。

值得在這一點上注意兩件事情:

  1. 我假設system_date在你的表中的列,而不是一個的SYSDATE

  2. 誤解條款之間你是完全不正確,危險所以。

    順便說一下你的日期已經被表示出來,就好像你的NLS_DATE_FORMAT是DD-MON-YYYY(詳見​​瞭解更多詳情)。這意味着當您將日期隱式轉換爲字符時,會將其轉換爲此格式。

    你不使用一個datetime literal或你的值相比較,這意味着你的約會的explicit conversion被隱式轉換爲字符。然而,當你進行比較時,你會發現事情並不總是像他們所看到的那樣。字符比較通常是二進制的;這意味着,二月10個不是10 月和10 月至3月「三月」比「一月」小。

    始終顯式地轉換日期和總是對日期進行比較時,使用日期。

把所有的這一起查詢變爲:

select trunc(system_date), count(is_paid)` 
    from TPWEB.TP_CLIENT_TENDER_TRANS 
where system_date between date '2012-12-01' and date '2012-12-31' 
group by trunc(system_date) 
1

使用TRUNC函數,日期數據類型持有它的時間,因此使用TRUNC我們可以截斷時間。下面的查詢工作!

SELECT trunc(system_date),count (is_paid) 
    FROM TPWEB.TP_CLIENT_TENDER_TRANS 
    where system_date between '1-DEC-12' and '31-DEC-12' 
    group by trunc(system_date);